如何将事务数据与客户数据表联接,以及如何在SQL中执行基于案例的操作



我正在尝试在两个不同的表之间执行查询,并提出逐个案例的方案,提出特定月份的呼叫记录列表。

这是我的表格:

客户表:

+----+----------------+------------+
| id |      name      |   number   |
+----+----------------+------------+
|  1 | John Doe       | 8973221232 |
|  2 | American Dad   | 7165531212 |
|  3 | Michael Clean  | 8884731234 |
|  4 | Samuel Gatsby  | 9197543321 |
|  5 | Mike Chat      | 8794029819 |
+----+----------------+------------+

交易数据:

+----------+------------+------------+----------+---------------------+
| trans_id |  incoming  |  outgoing  | duration |      date_time      |
+----------+------------+------------+----------+---------------------+
|        1 | 8973221232 | 9197543321 |       64 | 2018-03-09 01:08:09 |
|        2 | 3729920490 | 7651113929 |      276 | 2018-07-20 05:53:10 |
|        3 | 8884731234 | 8973221232 |      382 | 2018-05-02 13:12:13 |
|        4 | 8973221232 | 9234759208 |      127 | 2018-07-07 15:32:30 |
|        5 | 7165531212 | 9197543321 |      852 | 2018-08-02 07:40:23 |
|        6 | 8884731234 | 9833823023 |      774 | 2018-07-03 14:27:52 |
|        7 | 8273820928 | 2374987349 |      120 | 2018-07-06 05:27:44 |
|        8 | 8973221232 | 9197543321 |       79 | 2018-07-30 12:51:55 |
|        9 | 7165531212 | 7651113929 |      392 | 2018-05-22 02:27:38 |
|       10 | 5423541524 | 7165531212 |      100 | 2018-07-21 22:12:20 |
|       11 | 9197543321 | 2983479820 |      377 | 2018-07-20 17:46:36 |
|       12 | 8973221232 | 7651113929 |      234 | 2018-07-09 03:32:53 |
|       13 | 7165531212 | 2309483932 |       88 | 2018-07-16 16:22:21 |
|       14 | 8973221232 | 8884731234 |       90 | 2018-09-03 13:10:00 |
|       15 | 3820838290 | 2093482348 |      238 | 2018-04-12 21:59:01 |
+----------+------------+------------+----------+---------------------+

我要完成什么?

我正在尝试为2018年7月拨打电话的每个客户编制一份"成本"清单。费用基于:

1)如果客户接到电话(来电),通话费用等于持续时间;

2) 如果客户拨打了电话(传出),如果通话持续时间为 30 或更少,则通话费用为 100。如果超过 30 个持续时间,则成本为 100 加上超出期间的 5 * 持续时间。

如果客户在该个月内没有拨打任何电话,他就不应该在列表中。

例子:

1) 客户美国爸爸有 3 个来电和 1 个去电,但只有 10 和 13 trans_id是 7 月份的。他应该总共支付 538:

  • 对于trans_id 10 = 450(前 100 秒 + 5 * 70

    秒为剩余时间)
  • 对于trans_id 13 = 88

2) 客户塞缪尔·盖茨比有 1 个来电和 3 个去电,但只有 8 和 11 trans_id是 7 月份的。他应该总共支付 722:

  • 对于 trans_id 8 = 345(前 100 秒为 30 + 剩余秒为 5 * 49)

  • 对于trans_id 11 = 377

仅考虑这两个示例,输出将是:

+----+----------------+------------+------------+
| id |      name      |   number   |  billable  |
+----+----------------+------------+------------+
|  2 | American Dad   | 7165531212 |        538 |
|  4 | Samuel Gatsby  | 9197543321 |        722 |
+----+----------------+------------+------------+

注意:Mike Chat 不应该出现在列表中,因为他在该特定月份没有拨打或接听任何电话。

到目前为止,我尝试了什么?

我一直在玩这个猫捉老鼠的游戏,我使用数字作为唯一 ID,已经尝试了完整的外部连接和组合,其中传入或传出不为空,然后按大小写应用规则,尝试做左连接并应用案例,但我在兜圈子,我无法进入最终列表。每当我来往或传出时,我要么无法应用案例,要么无法同时进行。非常感谢您的帮助!

select customer_name.name, customer_name.number, bill = (CASE
WHEN customer_name.number = transaction_data.incoming then 'sum bill'
else 'multiply and add'
end)
from customer_name
left join transaction_data on customer_name.number = transaction_data.incoming or customer_name.name = transaction_data.outgoing
where strftime('%Y-%m', transaction_data.date_time) = '2018-07'

注意:我正在使用 sqlite 在线试用,但数据库在 SQL Server 2012 上,所以我知道我可以更轻松地使用日期格式,但我想尽可能接近 T-SQL。

还尝试创建一个案例来确定它是来电还是传出,但我只是因此而收到来电,即使 trans_id 10 是传出:

select name, number, duration, case 
when customer_name.number = transaction_data.incoming then 'incoming'
when customer_name.number = transaction_data.outgoing then 'outgoing'
END direction
from customer_name
left join transaction_data on customer_name.number = transaction_data.incoming or customer_name.name = transaction_data.outgoing
where strftime('%Y-%m', transaction_data.date_time) = '2018-07'

试试这个:

SELECT
c."name", c.number,
SUM(CASE c.number
WHEN t.incoming THEN t.duration
ELSE IIF(t.duration - 30 < 0, 0, t.duration - 30) * 5 + 100
END) AS billable
FROM Customer AS c INNER JOIN [Transaction] AS t
ON c.number IN(t.incoming, t.outgoing)
WHERE t.date_time >= '20180701' AND t.date_time < '20180801'
GROUP BY c."name", c.number

输出:

|     name      |   number   | billable |
+---------------+------------+----------+
| John Doe      | 8973221232 |      440 |
| American Dad  | 7165531212 |      538 |
| Michael Clean | 8884731234 |      774 |
| Samuel Gatsby | 9197543321 |      722 |

使用 SQL Fiddle 在线测试它。

相关内容

  • 没有找到相关文章

最新更新