计算SQL中的电话费用

时间:2010-02-06 00:35:57

标签: sql

Q1:

答:电信SQL Server数据库中有两个表 - 客户和费率如下所示:

客户

PK  CustomerPhoneNumber   varchar(15)
    CustomerType          int              -the type of customer

价格

FK  CustomerType          int              - the type of customer
    CountryCode           varchar(4)       – the country calling code
    Rate                  float            - the rate per minute of phone call

示例国家/地区代码:

1 – USA
1809 – Dominican Republic
44 – Great Britain
359 – Bulgaria

所以美国的电话号码是13104405609。

如表中所示,费率取决于客户类型和所呼叫的国家/地区。

考虑到呼叫的完整始发和目的地电话号码(包括国家/地区代码)及其持续时间(以分钟为单位),请编写单个SQL语句来计算呼叫费用。

为方便起见,让SQL语句的参数称为@FromPhoneNumber,@ ToPhoneNumber,@ Duration。

3 个答案:

答案 0 :(得分:0)

如果总费率是原始国家的费率+目的地国家的费率

(顺便说一下,从商业模式的角度来看,没有任何意义,因为任何一家公司都不会控制或应用许多离散费率)

但如果是,则SQL将是:

 Select @Duration *
  ((Select fR.Rate
    From Customers fC Join Rates fR 
      On fR.CustomerType = fC.CustomerType
    Where fC.CustomerPhoneNumber = @FromPhoneNumber) 
    +
   (Select tR.Rate
    From Customers tC Join Rates tR 
      On tR.CustomerType = tC.CustomerType
    Where tC.CustomerPhoneNumber = @ToPhoneNumber))

答案 1 :(得分:0)

SELECT CostofCall = @Duration * Sum(Rate)
FROM
   Customers C
   INNER JOIN Rates R ON C.CustomerType = R.CustomerType
WHERE
   C.CustomerPhoneNumber IN (@FromPhoneNumber, @ToPhoneNumber)

答案 2 :(得分:0)

这是我的看法:

SELECT r.rate * @Duration
  FROM CUSTOMERS c
  JOIN RATES r ON r.customertype = c.customertype
              AND (LEFT(r.countrycode, 1) = LEFT(@ToPhoneNumber, 1)
                OR LEFT(r.countrycode, 2) = LEFT(@ToPhoneNumber, 2)
                OR LEFT(r.countrycode, 3) = LEFT(@ToPhoneNumber, 3)
                OR LEFT(r.countrycode, 4) = LEFT(@ToPhoneNumber, 4))
 WHERE c.customerphonenumber = @FromPhoneNumber

我让@FromPhoneNumber成为了如何找到特定客户的方法。要了解该客户的收费率,您需要根据以下因素与客户建立相关费率:

  1. customertype
  2. 被叫号码的countrycode
  3. 因为countrycode的数据类型是VARCHAR(4),并且没有定义参数的任何数据类型 - 所以做出了假设。代码并不完全安全,但我们的想法是只返回一个速率,因为代码应该是唯一的。

    有人可以向我解释为什么其他答案结合了费率?您何时通过电话向两个方向收费?