0

かなり単純なスクリプトを作成します。組織の国際通話料金をすべて合計する必要があります。phonelog テーブルと rate テーブルの 2 つのテーブルがあります。

私が解決した解決策は簡単です:

電話ログテーブルから宛先の国コードと通話時間を選択します

料金表から 1 分あたりの料金を選択します (先ほど選択した目的地の国コードを使用)

次に、すべての国際電話の通話時間と 1 分あたりのコスト (CPM) を乗算し、total という名前の変数に追加します。これは最後にユーザーに表示されます。

さて、これを好きなように書くことができれば、約30分でこれを行うことができます. しかし、その大部分を SQL で書かなければならないと言われました。

だから私は少しグーグルで検索し、ストアドプロシージャを使用することにしました。

最初の選択クエリの結果をどのようにトラバースしますか? これが ColdFusion または PHP にある場合、単純に結果を配列に入れますが、1 つのクエリの結果を SQL の配列に挿入する方法を見つけられませんでした。

2番目:これらの手順を要約する方法はありますか?

例えば:

total = 0
select destinationareacode, duration from phonelogs, where destination=international 
for each record, select CPM from rates, where areacode = (record.destinationareacode)
 total+=CPM*(duration/60)

そして、合計がユーザーに表示されます。

とにかく...私の質問を明確にするために:

一連のクエリ結果をトラバースするにはどうすればよいですか? 結果自体 (エリアコード) をそのクエリの条件として使用して、それらの結果をトラバースしながら別のクエリを実行することは可能ですか?

これがすべて複雑に思われる場合は申し訳ありませんが、質問を他にどのように表現すればよいかわかりません。

4

2 に答える 2

2

あなたはおそらく次のようなものが欲しい

select rates.areacode, sum(cpm*(duration/60))
from  phonelogs
    join rates on rates.areacode = phonelogs.destinationareacode
where phonelogs.destination = 'international'
group by rates.areacode 

理論的には、これにより、ログ内のすべての通話の合計料金が市外局番ごとに表示されます。テーブルなどの知識がなくてもうまくいくかどうかはわかりませんが、これでどこに行くべきかがわかります。 一般に、SQLでループを実行したい場合は、間違っています。

于 2012-12-18T21:03:12.547 に答える
2

命令型プログラミング言語 (マシンの状態と、操作から操作への実行制御の流れを明示的に定義する言語)に慣れているのは明らかですが、SQL はより宣言的 (単に計算ロジックを表現する言語) です。

これは非常に異なるパラダイムであり、時間をかけて研究する価値があります。これは、特にリレーショナル データベースの分野で信じられないほど役立つ (そしてどこにでもある) という理由だけでなく、別のパラダイムを研究することでプログラミング全般について多くのことを学ぶことができるからです。

あなたの場合、あなたがしたいことは、各通話の時間 (分単位) の合計を選択し、1 分あたりのコストを掛けることです。

SELECT SUM(duration/60 * CPM)

市外局番で結合されたphonelogsおよびテーブルからこのデータを取得しています。rates

FROM   phonelogs JOIN rates ON rates.areacode = phonelogs.destinationareacode

それだけです (あいまいさがある場合にテーブル識別子で列を修飾する場合を除いて):

SELECT SUM(phonelogs.duration/60 * rates.CPM)
FROM   phonelogs JOIN rates ON rates.areacode = phonelogs.destinationareacode
于 2012-12-18T21:25:24.097 に答える