总和案例当条款

Chr*_*ris 6 sql-server pivot case sql-server-2014 sum

我有以下查询,我希望老化配置文件显示为新列我的老化配置文件为 0-30、31-60、61-90、91-120、121-180、181-365、365+

我基本上希望结果出现在网络到期时出现在适当的老化支架中。

BU   0-30   31-60   61-90   91-120   121-180   181-365   365+
--------------------------------------------------------------
A    
B
C
Run Code Online (Sandbox Code Playgroud)

询问:

select
 BU,
 Ageing,
 sum(NetDue) as Netdue
 from [dbo].[vw_FACT_CONSOL_CREDITORS]
 where date = @date
 Group by BU, Ageing
Order by BU ;
Run Code Online (Sandbox Code Playgroud)

我是 SQL 的新手,只是想学习所以很抱歉,因为这是基本的东西谢谢

mat*_*ewb 3

假设老化值与预期输出中的列名称匹配,那么这应该有效:

SELECT  *
FROM    (
    SELECT  BU, Ageing, NetDue
    FROM    [dbo].[vw_FACT_CONSOL_CREDITORS]
    WHERE   Date = @date
) src
PIVOT
(
    SUM(NetDue)
    FOR Ageing IN ([0-30], [31-60], [61-90], [91-120], [121-180], [181-365], [365+])
) piv
Run Code Online (Sandbox Code Playgroud)

如果不是,那么您将需要向内部 select 语句添加一些逻辑,以将 Aging 从任何内容转换为这些字符串值(例如“0-30”、“365+”)。

作为检查这一点的示例,我执行了以下操作:

CREATE TABLE x (
    BU INT,
    NetDue SMALLMONEY,
    Ageing VARCHAR(10),
    Date DATE
)

INSERT x
VALUES 
  (1, 100, '31-60', '2017-04-01'),
  (2, 25.47, '31-60', '2017-04-01'),
  (1, 90.17, '31-60', '2017-05-01'),
  (1, 16.42, '181-365', '2017-04-01'),
  (2, 99.99, '365+', '2017-04-01')

SELECT  *
FROM    (
    SELECT  BU, Ageing, NetDue
    FROM    x
    WHERE   Date = '2017-04-01'
) src
PIVOT
(
    SUM(NetDue)
    FOR Ageing IN ([0-30], [31-60], [61-90], [91-120], [121-180], [181-365], [365+])
) piv
Run Code Online (Sandbox Code Playgroud)

产生的输出:

BU  0-30    31-60   61-90   91-120  121-180 181-365 365+
1   NULL    100.00  NULL    NULL    NULL    16.42   NULL
2   NULL    25.47   NULL    NULL    NULL    NULL    99.99
Run Code Online (Sandbox Code Playgroud)

用于确定此逻辑的所有信息(以及更多信息)都可以在此处找到。