由case语句创建的列不按分组

时间:2017-10-21 05:13:50

标签: sql-server case

这是一个T-SQL查询:

SELECT 
    A.DateStamp,
    CASE WHEN A.T = 10 THEN A.counts END AS HT,  
    CASE WHEN A.T = 98 THEN A.counts END AS BP,
    CASE WHEN A.T = 94 THEN A.counts END AS MP,
    CASE WHEN A.T = 12 THEN A.counts END AS SP
FROM  
    A                        
WHERE 
    (A.date_time BETWEEN GETDATE() - 60 AND GETDATE() - 30)   -- say 
--GROUP BY A.DateStamp,A.T,A.counts
ORDER BY
    CONVERT(DATE, A.DateStamp) ASC

效果很好。以前我使用的是表A的多个副本,所有人都加入了。在这里结果是正确的,但分成多行,如:

date       | BP | MP | SP | HT |
-----------+----+----+----+----+
22/10/2017   12   34   56   78
Looks Like   --   --   --   --
22/10/2017   12   --   --   --
22/10/2017   --   34   --   --
22/10/2017   --   --   56   --
22/10/2017   --   --   --   78

2 个答案:

答案 0 :(得分:2)

您需要使用条件聚合GROUP BY仅使用DateStamp字段:

SELECT A.DateStamp,
       SUM(CASE WHEN A.T=10 THEN A.counts ELSE 0 END) AS HT,  
       SUM(CASE WHEN A.T=98 THEN A.counts ELSE 0 END) AS BP,
       SUM(CASE WHEN A.T=94 THEN A.counts ELSE 0 END) AS MP,
       SUM(CASE WHEN A.T=12 THEN A.counts ELSE 0 END) AS SP
FROM  A                        
WHERE (A.date_time BETWEEN getdate()-60 AND getdate()-30) 
GROUP BY A.DateStamp
ORDER BY convert(date,A.DateStamp) ASC

答案 1 :(得分:1)

我猜您只需按日期分组

SELECT convert(date,A.DateStamp) AS Date,
       SUM(CASE WHEN A.T=10 THEN A.counts END) AS HT ,  
       SUM(CASE WHEN A.T=98 THEN A.counts END) AS BP,
       SUM(CASE WHEN A.T=94 THEN A.counts END) AS MP,
       SUM(CASE WHEN A.T=12 THEN A.counts END) AS SP
FROM  A                        
WHERE A.date_time BETWEEN getdate()-60 AND getdate()-30
GROUP BY convert(date,A.DateStamp) 
ORDER BY convert(date,A.DateStamp) ASC