Sql 如何按行和字段的具体值进行汇总
我必须对表运行查询,以获得每个特定字段值的总和。Sql 如何按行和字段的具体值进行汇总,sql,sql-server,Sql,Sql Server,我必须对表运行查询,以获得每个特定字段值的总和。 rechargedate originid ------------------------ 2015-02-02 3 2015-02-02 3 2015-02-02 1 2015-02-02 1 2015-02-02 3 2015-02-02 2 2015-02-01 2 2015-02-01 3 2015-02-01 1 2015-02-01
rechargedate originid
------------------------
2015-02-02 3
2015-02-02 3
2015-02-02 1
2015-02-02 1
2015-02-02 3
2015-02-02 2
2015-02-01 2
2015-02-01 3
2015-02-01 1
2015-02-01 1
2015-02-01 2
查询结果应该如下所示:
rechargedate orig1 orig2 orig3
-------------------------------------
2015-02-02 2 1 3
2015-02-01 2 2 1
如何使用MS SQL 2008实现这一点?您可以使用条件聚合:
CREATE TABLE #temp(
RechargeDate DATE,
OriginID INT
)
INSERT INTO #temp VALUES
('2015-02-02', 3),('2015-02-02', 3),('2015-02-02', 1),
('2015-02-02', 1),('2015-02-02', 3),('2015-02-02', 2),
('2015-02-01', 2),('2015-02-01', 3),('2015-02-01', 1),
('2015-02-01', 1),('2015-02-01', 2);
SELECT
RechargeDate,
orig1 = SUM(CASE WHEN OriginID = 1 THEN 1 ELSE 0 END),
orig2 = SUM(CASE WHEN OriginID = 2 THEN 1 ELSE 0 END),
orig3 = SUM(CASE WHEN OriginID = 3 THEN 1 ELSE 0 END)
FROM #temp
GROUP BY RechargeDate
ORDER BY RechargeDate DESC
DROP TABLE #temp
结果
RechargeDate orig1 orig2 orig3
------------ ----------- ----------- -----------
2015-02-02 2 1 3
2015-02-01 2 2 1
您可以使用条件聚合:
CREATE TABLE #temp(
RechargeDate DATE,
OriginID INT
)
INSERT INTO #temp VALUES
('2015-02-02', 3),('2015-02-02', 3),('2015-02-02', 1),
('2015-02-02', 1),('2015-02-02', 3),('2015-02-02', 2),
('2015-02-01', 2),('2015-02-01', 3),('2015-02-01', 1),
('2015-02-01', 1),('2015-02-01', 2);
SELECT
RechargeDate,
orig1 = SUM(CASE WHEN OriginID = 1 THEN 1 ELSE 0 END),
orig2 = SUM(CASE WHEN OriginID = 2 THEN 1 ELSE 0 END),
orig3 = SUM(CASE WHEN OriginID = 3 THEN 1 ELSE 0 END)
FROM #temp
GROUP BY RechargeDate
ORDER BY RechargeDate DESC
DROP TABLE #temp
结果
RechargeDate orig1 orig2 orig3
------------ ----------- ----------- -----------
2015-02-02 2 1 3
2015-02-01 2 2 1
最简单的方法是使用CASE语句创建所需的列,然后进行求和,例如
SELECT rechargedate,
SUM(CASE WHEN originid = 1 THEN 1 ELSE 0 END) AS orig1,
SUM(CASE WHEN originid = 2 THEN 1 ELSE 0 END) AS orig2,
SUM(CASE WHEN originid = 3 THEN 1 ELSE 0 END) AS orig3
FROM {your_table}
GROUP BY rechargedate
ORDER BY rechargedate DESC
最简单的方法是使用CASE语句创建所需的列,然后进行求和,例如
SELECT rechargedate,
SUM(CASE WHEN originid = 1 THEN 1 ELSE 0 END) AS orig1,
SUM(CASE WHEN originid = 2 THEN 1 ELSE 0 END) AS orig2,
SUM(CASE WHEN originid = 3 THEN 1 ELSE 0 END) AS orig3
FROM {your_table}
GROUP BY rechargedate
ORDER BY rechargedate DESC
使用
透视
。检查以了解SQL SERVER中的PIVIOT
。
SELECT rechargedate,
[1] AS orig1,
[2] AS orig2,
[3] AS orig3
FROM #TEST
PIVOT(COUNT(originid) FOR originid IN([1],[2],[3])) AS Piv
ORDER BY rechargedate DESC
使用
透视
。检查以了解SQL SERVER中的PIVIOT
。
SELECT rechargedate,
[1] AS orig1,
[2] AS orig2,
[3] AS orig3
FROM #TEST
PIVOT(COUNT(originid) FOR originid IN([1],[2],[3])) AS Piv
ORDER BY rechargedate DESC
到目前为止,嘟嘟尝试了什么?到目前为止,嘟嘟尝试了什么?谢谢你,伊万夫,很接近,但不完全如此。这也是我的解决方案。我在结果集中得到了一些零。谢谢你,evanv,很接近,但不完全一样。这也是我的解决方案。我在结果集中得到了一些零。太棒了!这正是我想要的,而且很简单。非常感谢。太棒了!这正是我想要的,而且很简单。非常感谢。谢谢你,库马尔,我尝试了Wewe解决方案,因为它与我所尝试的类似,工作起来很有魅力。我感谢你的时间。谢谢你,库马尔,我尝试了Wewe解决方案,因为它与我所尝试的类似,工作起来很有魅力。谢谢你抽出时间。