从数据透视表中删除null(从多个列和不同数据类型中删除)

时间:2019-06-20 04:34:19

标签: sql

我想将此表格转到下表(预期结果)

CompanyID   Amount      Status  ID  Year
58          10000.00    PENDING 54  2018
59          10000.00    PENDING 55  2018
59          5300.00     PAID    56  2015
59          5300.00     PENDING 57  2013
59          10600.00    PENDING 58  2016
60          10600.00    PAID    59  2016
60          10600.00    PENDING 60  2017
60          10000.00    PENDING 61  2018
61          10000.00    PAID    62  2018
61          10600.00    PAID    63  2016
61          10600.00    PAID    64  2017
67          5300.00     PAID    65  2015
67          10600.00    PAID    66  2016

我正在尝试使用枢轴/枢轴,但仍然无法正常工作

CompanyID  A2015  S2015 A2016   S2016   A2017   S2017   A2018   S2018
58         NULL   NULL  NULL    NULL    NULL    NULL    10000.00PENDING
59         NULL   NULL  NULL    NULL    NULL    NULL    NULL    NULL
59         NULL   NULL  NULL    NULL    NULL    NULL    10000.00PENDING
59         NULL   NULL  10600.00PENDING NULL    NULL    NULL    NULL
59         5300.00PAID  NULL    NULL    NULL    NULL    NULL    NULL
60         NULL   NULL  NULL    NULL    NULL    NULL    10000.00PENDING
60         NULL   NULL  NULL    NULL    10600.00PENDING NULL    NULL
60         NULL   NULL  10600.00PAID    NULL    NULL    NULL    NULL
61         NULL   NULL  NULL    NULL    NULL    NULL    10000.00PAID
61         NULL   NULL  NULL    NULL    10600.00PAID    NULL    NULL
61         NULL   NULL  10600.00PAID    NULL    NULL    NULL    NULL
67         NULL   NULL  NULL    NULL    NULL    NULL    10000.00PAID
67         NULL   NULL  NULL    NULL    10600.00PAID    NULL    NULL

试图在一个查询中转换2种不同的数据类型和多列

    SELECT CompanyID,[A2015],[S2015],[A2016],[S2016],[A2017],[S2017],[A2018],[S2018]
FROM
(   SELECT CompanyID, [Status], 
    'A' + [Year] AS [Year_Amount],
    'S' + [Year] AS [Year_Status],
    (Select ORGANIZATION from [Membership].[dbo].[Members]
where ID=[Payment].CompanyID ) as Organisation,[Amount]
    FROM [Membership].[dbo].[Payment]) as sourcetable

pivot (
SUM([Amount]) for [Year_Amount] in ([A2015],[A2016],[A2017],[A2018]))
 as Pvt

pivot (
MIN([Status]) for [Year_Status] in ([S2015],[S2016],[S2017],[S2018])) 
as Pvt2

预期的输出应该是这样

CompanyID A2015   S2015 A2016    S2016   A2017    S2017   A2018    S2018
58        NULL    NULL  NULL     NULL    NULL     NULL    10000.00 PENDING
59        5300.00 PAID  10600.00 PENDING NULL     NULL    10000.00 PENDING
60        NULL    NULL  10600.00 PAID    10600.00 PENDING 10000.00 PENDING
61        NULL    NULL  10600.00 PAID    10600.00 PAID    10000.00 PAID
67        NULL    NULL  NULL     NULL    10600.00 PAID    10000.00 PAID

伙计,请先谢谢

1 个答案:

答案 0 :(得分:0)

这里的问题似乎是对金额进行pivotpivoting中存在多余的列。我认为您需要做两个单独的pivoting,然后合并它们的结果。为了在我的本地机器上对此进行测试,我创建了一个变量表,即@xyz,如下面的脚本所示-

declare @xyz table (CompanyID int, Amount decimal(10,2), [Status] varchar(50), ID int, [Year] varchar(4));

insert into @xyz
          select 58, 10000.00, 'PENDING' ,54,  '2018'
union all select 59, 10000.00, 'PENDING' ,55,  '2018'
union all select 59, 5300.00 , 'PAID'    ,56,  '2015'
union all select 59, 5300.00 , 'PENDING' ,57,  '2013'
union all select 59, 10600.00, 'PENDING' ,58,  '2016'
union all select 60, 10600.00, 'PAID'    ,59,  '2016'
union all select 60, 10600.00, 'PENDING' ,60,  '2017'
union all select 60, 10000.00, 'PENDING' ,61,  '2018'
union all select 61, 10000.00, 'PAID'    ,62,  '2018'
union all select 61, 10600.00, 'PAID'    ,63,  '2016'
union all select 61, 10600.00, 'PAID'    ,64,  '2017'
union all select 67, 5300.00 , 'PAID'    ,65,  '2015'
union all select 67, 10600.00, 'PAID'    ,66,  '2016'

;WITH Amount_Pivoting AS (
    SELECT * FROM (
        SELECT
            CompanyID,
            'A' + [Year] AS [Year_Amount],
            [Amount]
        FROM @xyz
        ) AS sourcetable
        PIVOT (
        SUM([Amount]) for [Year_Amount] in ([A2015],[A2016],[A2017],[A2018]))
        AS Pvt
),
Status_Pivoting AS (
    SELECT * FROM (
        SELECT
            CompanyID,
            'S' + [Year] AS [Year_Status],
            [Status]
        FROM @xyz
        ) AS sourcetable
        PIVOT (
        MIN([Status]) for [Year_Status] in ([S2015],[S2016],[S2017],[S2018]))
        AS Pvt
)
SELECT *
FROM Amount_Pivoting A
INNER JOIN Status_Pivoting S ON A.CompanyID = S.CompanyID;

注意-我在此脚本中使用了CTE来保存两个数据透视结果。请用表名替换@xyz