【问题标题】:Aggregating table data - grouping sets? other?聚合表数据 - 分组集?其他?
【发布时间】:2020-06-25 23:55:30
【问题描述】:

我正在尝试在不运行多项选择的情况下聚合报告的多个列。
这是一个位列,我想为每列显示 2 行(是行和否行)。 想要的结果是这样的:

    |Alimony |Married |HasCustody
Yes |3       |2       |4
No  |2       |3       |1

我尝试做 SUM(将 IsPayingAlimony 转换为 tinyint)。我查看了枢轴、非枢轴、立方体、汇总。我认为我最接近的是按组分组。但即使使用分组集,我也无法到达两行。 这是我的sql:

CREATE TABLE ClientStatus
(  ClientID INT NOT NULL,
   IsPayingAlimony BIT NOT NULL,
   IsMarried BIT NOT NULL,
   HasCustody BIT NOT NULL,
   CONSTRAINT [PK_Status] PRIMARY KEY NONCLUSTERED 
   (
    [ClientID] ASC
   )
)
;
INSERT INTO ClientStatus
(ClientID, IsPayingAlimony, IsMarried, HasCustody)
VALUES (1,0,0,0)
      ,(2,1,1,1)
      ,(3,1,0,1)
      ,(4,0,1,1)
      ,(5,1,0,1) 
;

SELECT * FROM ClientStatus

这里是group by grouping sets查询。

SELECT IsPayingAlimony, IsMarried, HasCustody, COUNT(*) AS Records
 FROM ClientStatus
GROUP BY Grouping Sets ((IsPayingAlimony), (IsMarried), (HasCustody))

这是结果。恐怕我想多了(想多了?!)这个,但我不知道如何把它降到 2 行。

IsPayingAlimony |IsMarried |HasCustody |Records
NULL            |NULL      |0          |1
NULL            |NULL      |1          |4
NULL            |0         |NULL       |3
NULL            |1         |NULL       |2
0               |NULL      |NULL       |2
1               |NULL      |NULL       |3

任何帮助或建议将不胜感激。

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    我在想values() 和条件聚合:

    select
        v.descr,
        sum(case when cs.IsPayingAlimony = v.val then 1 else 0 end) alimony,
        sum(case when cs.IsMarried       = v.val then 1 else 0 end) married,
        sum(case when cs.HasCustody      = v.val then 1 else 0 end) has_custody
    from ClientStatus cs
    cross join (values (1, 'Yes'), (0, 'No')) v(val, descr)
    group by v.descr
    

    Demo on DB Fiddle

    描述 |赡养费 |结婚了| has_custody :---- | ------: | ------: | ----------: 没有 | 2 | 3 | 1 是 | 3 | 2 | 4

    【讨论】:

    • 做到了!对于我发现的一些空值,我将不得不做一些额外的操作,否则这正是我所需要的。我无法投票,因为我没有足够的声望点。非常感谢您的快速回复。
    【解决方案2】:

    当另一个答案发布时,我几乎完成了这个,分心了,只是处理它的方式略有不同:

    ;WITH poss(yn, oo) AS (SELECT 'Yes',1 UNION ALL SELECT 'No',0)
    SELECT poss.yn, 
      Alimony = SUM(CASE cs.IsPayingAlimony WHEN poss.oo THEN 1 ELSE 0 END),
      Married = SUM(CASE cs.IsMarried       WHEN poss.oo THEN 1 ELSE 0 END),
      Custody = SUM(CASE cs.HasCustody      WHEN poss.oo THEN 1 ELSE 0 END)
    FROM poss CROSS JOIN dbo.ClientStatus AS cs
    GROUP BY poss.yn;
    

    【讨论】:

    • 这也有效。 GMB 得到了复选标记,因为他发布的速度快了一点。你和他的回答都清晰简洁。感谢您的回复!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-01
    相关资源
    最近更新 更多