分组为列:如何在查询中生成SUMCASE ...列,而不是为每种情况复制一次粘贴?

问题描述

我正在尝试执行“分组到列”的查询。我找到的相关答案使用的格式如下(https://stackoverflow.com/a/666442):

SELECT 
OrganizationName,OrganizationID,SUM(CASE WHEN ReceivableStatus       = '30-60 days' THEN InvoiceFee ELSE 0 END) AS [30 - 60 Days],SUM(CASE WHEN ReceivableStatus       = '60-90 days' THEN InvoiceFee ELSE 0 END) AS [60 - 90 Days],SUM(CASE WHEN ReceivableStatus       = '90-120 days' THEN InvoiceFee ELSE 0 END) AS [90 - 120 Days]

FROM
v_InvoicesFreelanceOutstanding
GROUP BY OrganizationID

因此,您可以将数据分组为3列,并使用case从每一个中有选择地进行选择。但是,如果您有100个案例(在不同的情况下)怎么办?当然,解决方案不只是将SUM(CASE...行复制和粘贴100次,并为每列设置不同的条件?有没有办法钩上类似generate_series之类的内容以编程方式生成列?

一个更清晰的例子:

我有此数据:

+---------+-------------+---------------------+
| User ID | Account Age | Active After X Days |
+---------+-------------+---------------------+
| A       |           2 |                   0 |
| A       |           2 |                   1 |
| A       |           2 |                   2 |
| B       |           2 |                   0 |
| B       |           2 |                   1 |
| C       |           3 |                   0 |
| C       |           3 |                   1 |
| C       |           3 |                   2 |
+---------+-------------+---------------------+

其中每一行代表1位用户,该用户的帐户已达到“帐户年龄”天(在查询时),已在X天后采取了某些措施。每个用户在其帐户有效期内每天可以出现一次。

我希望能够输出以下内容

+---------------------+-----------+------------+------------+
| Active After X Days | 1 Day Old | 2 Days Old | 3 Days Old |
+---------------------+-----------+------------+------------+
|                   0 |         0 |          2 |          1 |
|                   1 |         0 |          2 |          1 |
|                   2 |         0 |          1 |          1 |
|                   3 |         0 |          0 |          0 |
|                   4 |         0 |          0 |          0 |
|                   5 |         0 |          0 |          0 |
+---------------------+-----------+------------+------------+

,但不必手动列出1天,2天,3天的时间或X天后的活动时间,而是可以在查询中指定我要在0-5天后进行活动的帐户以及1-3天的活动时间。在这种情况下,翻转轴也可以。

换句话说,有效地使它更像传统的非sql 2d表,可以用两个轴这样绘制它:

+---------------------+-----------+------------+------------+
|                     | 1 Day Old | 2 Days Old | 3 Days Old |
+---------------------+-----------+------------+------------+
| Active After X Days |                                     |
+---------------------+-----------+------------+------------+
|                   0 |         0 |          2 |          1 |
|                   1 |         0 |          2 |          1 |
|                   2 |         0 |          1 |          1 |
|                   3 |         0 |          0 |          0 |
|                   4 |         0 |          0 |          0 |
|                   5 |         0 |          0 |          0 |
+---------------------+-----------+------------+------------+

我只是想以这种方式直观地查看数据,但是我不确定是否有可能。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)