0

我有一个相当简单的脚本要编写:我必须为我的组织计算所有国际通话费用。我有两个表:电话记录表和费率表。

我确定的解决方案很简单:

从电话记录表中选择目的地国家代码和通话时长

从费率表中选择每分钟的费用(使用我刚刚选择的目的地国家代码)

然后将每个国际电话的持续时间和每分钟费用 (CPM) 相乘,并将其添加到一个名为 total 的变量中,该变量在最后显示给用户。

现在,如果我能够以任何我想要的方式写这个,我将能够在大约 30 分钟内完成。但是,有人告诉我,我必须用 SQL 编写大部分内容。

所以我用谷歌搜索了一下并决定使用存储过程,所以:

我将如何遍历第一个选择查询的结果?如果这是在 ColdFusion 或 PHP 中,我会简单地将结果放入一个数组中——但我还没有找到一种方法将一个查询的结果插入到 SQL 中的一个数组中。

第二:有没有办法浓缩这些步骤?

例如:

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

您显然习惯于命令式编程语言(其中一种明确定义机器的状态和从操作到操作的执行控制流),而 SQL 更具声明性(其中一种仅表达计算逻辑)。

这是一个非常不同的范式,非常值得花一些时间来研究,不仅因为它在关系数据库领域非常有用(并且有点无处不在),而且还因为人们可以通过研究替代范式来学习很多关于编程的知识。

在您的情况下,您想要做的是选择每个呼叫的持续时间(以分钟为单位)的总和,乘以每分钟的成本:

SELECT SUM(duration/60 * CPM)

您正在从phonelogsrates表中获取此数据,并加入区号:

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 回答
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 回答