1
ClientID 金额标志
MMC 600 1  
MMC 700 1
FDN 800 1
FDN 350 2
FDN 700 1

使用 sql server,下面的查询我从 FDN 得到 2 行。我只想将 Client 值组合在一行中。输出应该像

客户端 gtcount, totalAmountGreaterThan500 lscount,AmountLessThan500
MMC 2 1300 0 0
FDN 2 1500 1 350
SELECT 
    f.ClientID,f.flag,    
case when flag = 1 then count(*) END as gtcount,
    SUM(CASE WHEN flag = 1 THEN Amount END) AS totalAmountGreaterThan500,
case when flag = 2 then count(*) END as lscount,
    SUM(CASE WHEN Flag = 2 THEN Amount END) AS AmountLessThan500,
from
    ( select ClientID, Amount,flag from #myTable)f
group by ClientID,f.flag
4

2 回答 2

1

尝试

SELECT ClientID,    
       SUM(CASE WHEN flag = 1 THEN 1 ELSE 0 END) AS gtcount,
       SUM(CASE WHEN flag = 1 THEN Amount ELSE 0 END) AS totalAmountGreaterThan500,
       SUM(CASE WHEN flag = 2 THEN 1 ELSE 0 END) AS lscount,
       SUM(CASE WHEN Flag = 2 THEN Amount ELSE 0 END) AS AmountLessThan500
  FROM Table1
 GROUP BY ClientID

输出:

| 客户 ID | GTCOUNT | 总量超过 500 | LSCOUNT | 数量超过 500 |
|----------|---------|--------------| ---------|--------------------------------|
| 互联网 | 2 | 1500 | 1 | 350 |
| MMC | 2 | 1300 | 0 | 0 |

这是SQLFiddle演示

于 2013-10-08T01:17:03.080 回答
0

看起来您想要的输出已关闭 - 没有任何mmc记录少于 500。您可以使用sumwithcase为每个字段完成此操作,flaggroup by

SELECT 
    ClientID,    
    SUM(CASE WHEN flag = 1 THEN 1 END) as gtcount,
    SUM(CASE WHEN flag = 1 THEN Amount END) AS totalAmountGreaterThan500,
    SUM(CASE WHEN flag = 2 THEN 1 END) as ltcount,
    SUM(CASE WHEN Flag = 2 THEN Amount END) AS AmountLessThan500
from myTable
group by ClientID

另一方面,不确定为什么需要该Flag字段。如果它只是用于表示少于记录,只需将逻辑添加到查询中:

SUM(CASE WHEN Amount <= 500 Then ...)
于 2013-10-08T01:17:33.513 回答