到目前为止,我并不是SQL方面的专家,但是我正在尽我最大的努力来充分利用它。
在清理和转换SQL中的数据之后,我在SQL中有一个名为PaymentData的大表。我的数据如下所示:
--------------------------------------------------------------------
Date | Code | User ID | Payment Amount
2018-09-26 | 111 | 1 | 125
2018-09-26 | 122 | 1 | 300
2018-09-26 | 177 | 1 | 150
2018-09-26 | 116 | 1 | 130
2018-09-26 | 118 | 1 | 180
2018-09-26 | 111 | 2 | 290
2018-09-26 | 122 | 2 | 200
2018-09-26 | 188 | 2 | 200
2018-09-26 | 199 | 2 | 310
注意,数据集在某种程度上是反复出现的。用户每个月都会得到报酬,这些付款被分配给特定的分配代码。因此,很有可能,例如,用户1在2018-10-26年具有相同的数量和代码。但也可以说,某个用户在另一个月中只有几个(或更多)代码和不同的支付金额。
因此,我想要创建一个新的表,它将数据按ID和日期分组,然后根据某些代码获取汇总和。例如,我希望有一列将代码111和122的付款金额合计为X,另一列Y只将按ID和日期等分组的177的金额之和。类似这样的情况,只有用户1和2:
--------------------------------------------------------------------
Date | X | Y | User ID
2018-09-26 | 425 | 150 | 1
2018-09-26 | 490 | 0 | 2
简要说明:
新表根据按日期和ID分组的代码列表创建包含累加金额的列。例如,在第X列中,每个日期和ID增加了代码111和112的数量,在Y列中有一个基于例如每个日期和ID的其他5个代码的总和,等等。
聚合它的最佳方法是什么,以便原则上我只能将每一列的代码列表传递给SQL,以便它为我整洁地处理它?
发布于 2018-10-30 12:49:49
您可以在这里使用条件聚合。
select
[Date]
,X = sum(case when Code in (111,222) then [Payment Amount] end)
,Y = sum(case when Code in (177) then [Payment Amount] end)
,[User ID]
from
SomeTable
group by
[Date], [User ID]
或者使用IIF
select
[Date]
,X = sum(iif(Code in (111,222),[Payment Amount],0))
,Y = sum(iif(Code = 177,[Payment Amount],0))
,[User ID]
from
SomeTable
与其将其存储在另一个表中,不如创建一个视图。
create view MyViewName
as
select
[Date]
,X = sum(case when Code in (111,222) then [Payment Amount] end)
,Y = sum(case when Code in (177) then [Payment Amount] end)
,[User ID]
from
SomeTable
然后称之为..。
select * from MyViewName
发布于 2018-10-30 12:49:48
CREATE VIEW STUFF AS
SELECT
[Date],
SUM(CASE WHEN CODE IN ('111','122') THEN [Payment Amount] ELSE 0 END AS x,
SUM(CASE WHEN CODE = '177' THEN [Payment Amount] ELSE 0 END AS y,
[user id]
FROM PaymentData
GROUP BY [Date], [user id]
发布于 2018-10-30 12:50:49
使用条件聚合,如
CREATE TABLE T
([Date] datetime, [Code] int, [User ID] int, [Payment Amount] int)
;
INSERT INTO T
([Date], [Code], [User ID], [Payment Amount])
VALUES
('2018-09-26 00:00:00', 111, 1, 125),
('2018-09-26 00:00:00', 122, 1, 300),
('2018-09-26 00:00:00', 177, 1, 150),
('2018-09-26 00:00:00', 116, 1, 130),
('2018-09-26 00:00:00', 118, 1, 180),
('2018-09-26 00:00:00', 111, 2, 290),
('2018-09-26 00:00:00', 122, 2, 200),
('2018-09-26 00:00:00', 188, 2, 200),
('2018-09-26 00:00:00', 199, 2, 310)
;
SELECT [Date],
[User ID],
SUM(CASE WHEN Code IN (111, 122) THEN [Payment Amount] ELSE 0 END) X,
SUM(CASE WHEN Code = 177 THEN [Payment Amount] ELSE 0 END) Y
FROM T
GROUP BY [Date], [User ID];
返回:
+---------------------+---------+-----+-----+
| Date | User ID | X | Y |
+---------------------+---------+-----+-----+
| 26/09/2018 00:00:00 | 1 | 425 | 150 |
| 26/09/2018 00:00:00 | 2 | 490 | 0 |
+---------------------+---------+-----+-----+
更新:
根据您的评论,Code
数据类型不是int,所以您可以更改
SUM(CASE WHEN Code IN ('111', '122') THEN [Payment Amount] ELSE 0 END) X,
SUM(CASE WHEN Code = '177' THEN [Payment Amount] ELSE 0 END) Y
https://stackoverflow.com/questions/53072540
复制相似问题