计算谁支付组1,2或3+

时间:2016-09-23 13:18:37

标签: sql sql-server sql-server-2012

我有一个类似下面示例的付款表格,我需要一个查询,告诉我支付了多少ID(AMOUNT> 0)1次,2次,3次或更多次。示例:

+----+--------+
| ID | AMOUNT |
+----+--------+
|  1 |     50 |
|  1 |      0 |
|  2 |     10 |
|  2 |     20 |
|  2 |     15 |
|  2 |     10 |
|  3 |     80 |
+----+--------+

我期待结果:

+-----------+------------+-------------+
| 1 payment | 2 payments | 3+ payments |
+-----------+------------+-------------+
|         2 |          0 |           1 |
+-----------+------------+-------------+

ID 1:付1次(50)。另一笔付款是0,所以我没算数。所以,1人付了1次。

ID 2:支付3次(10,20,15)。所以,1人支付了3次或更多次。

ID 3:付1次(80)。所以,2人付了1次。

我现在正在手动使用excel,但我非常确定有更实用的解决方案。有什么想法吗?

2 个答案:

答案 0 :(得分:4)

一个小的子查询就可以解决这个问题

Declare @YOurTable table (ID int, AMOUNT int)
Insert into @YourTable values
( 1 ,     50 ),
(  1 ,      0) ,
(  2 ,     10) ,
(  2 ,     20) ,
(  2 ,     15) ,
(  2 ,     10) ,
(  3 ,     80) 


Select [1_Payment] = sum(case when Cnt=1 then 1 else 0 end)
      ,[2_Payment] = sum(case when Cnt=2 then 1 else 0 end)
      ,[3_Payment] = sum(case when Cnt>2 then 1 else 0 end)
 From (
        Select id
              ,Cnt=count(*) 
         From  @YourTable 
         Where Amount<>0 
         Group By ID
      ) A

返回

1_Payment   2_Payment   3_Payment
2           0           1

答案 1 :(得分:3)

要获得您想要的输出,请尝试使用表格来形成数据,然后使用SELECT:

with c as (
    select count(*) count from mytable where amount > 0 group by id)
select 
sum(case count when 1 then 1 else 0 end) "1 Payment"
, sum(case count when 2 then 1 else 0 end) "2 Payments"
, sum(case when count > 2 then 1 else 0 end) "3 Payments" 
from c
您可以使用

Here is an example查看查询的工作方式。