尝试旋转时出现数据错误

Data error when trying to pivot

正在尝试在 SQL 服务器中转换数据。遇到错误,以前从未写过这样的东西。

现在的样子(每个类别都有数百个类别,请记住这一点并提出您的建议)

BLDGID  LEASID  SUITID   INCCAT  AMOUNT  PERIOD 
87000   100     AZ1        TAD    800   201601                                  
87000   200     AZ2        TAD    900   201603                                      
87000   300     AZ3        TAD    100   201607                                      
88000   400     AZ4        TAD    100   201607                                      
89000   500     AZ5        TAD    200   201609                                      
89000   600     AZ6        TAD    900   201611                                      
90000   700     AZ7        TAD    500   201612                                      
90000   800     AZ8        TAD    950   201602                                      

我希望它看起来如何

BLDGID  LEASID  SUITID  INCCAT  Jan Feb Mar Apr May June    Jul Aug Sept    Oct Nov Dec
87000   100      AZ1    TAD     800                                         
87000   200      AZ2    TAD             900                                 
87000   300      AZ3    TAD                         1000                    
88000   400      AZ4    TAD                                 100                 
89000   500      AZ5    TAD                                          200            
89000   600      AZ6    TAD                                                     900 
90000   700      AZ7    TAD                                                         500
90000   800      AZ8    TAD         950                                     

我一直在尝试的代码(不确定我是否在正确的轨道上)

SELECT  c.BLDGID AS 'BLDGID', 
        c.LEASID AS 'LEASID', 
        l.OCCPNAME AS 'OCCPNAME', 
        l.SUITID AS 'SUITID', 
        c.INCCAT AS 'INCCAT', 
        c.SRCCODE AS 'SRCCODE', 
        c.TRANAMT AS 'TRANAMT', 
        c.DESCRPTN AS 'DESCRPTN', 
        c.PERIOD AS 'PERIOD'
FROM SQLDATA.dbo.LEAS l
INNER JOIN SQLDATA.dbo.CMLEDG c
    ON l.BLDGID = c.BLDGID AND SQLDATA.dbo.LEAS.LEASID = c.LEASID
PIVOT (
    MAX(TRANAMT) 
    FOR PERIOD IN ([201601],[201602],[201603],[201607],[201609],[201611],[201612])
) as REVENUEPERITEM
WHERE  c.BLDGID &SPARM01
    AND c.INCCAT &SPARM02 
    AND c.SRCCODE NOT LIKE 'CR'
    AND c.DESCRPTN NOT LIKE 'CREDITAPPLY' 
    AND c.DESCRPTN NOT LIKE 'RECEIPT'
    AND c.PERIOD > '201512'

查看底部的编辑内容

作为旁注,我们在工作中使用了一个特殊程序 SPARM 你看到的东西是该程序的项目允许我编辑查询而不必重新编写它.

我遇到的问题是一个错误,内容是

There is an error in the SQL statement, Pivot grouping columns must be comparable. The type of column "ADDLDESC" is "text", which is not comparable.

新编辑从哪里开始

我当前的结果与 GOFR 的解决方案类似。

BLDGID  LEASID  SUITID  INCCAT  Jan Feb Mar Apr May June    Jul Aug Sept    Oct Nov Dec
87000   100      AZ1    TAD     800                                         
87000   100      AZ1    TAD         800
87000   200      AZ2    TAD             900                                 
87000   300      AZ3    TAD                         1000                    
88000   400      AZ4    TAD                                 100                 
89000   500      AZ5    TAD                                          200            
89000   600      AZ6    TAD                                                     900 
90000   700      AZ7    TAD                                                         500
90000   800      AZ8    TAD         950                                     

看到第 1 行和第 2 行有相同的 suitid,我想将它们合并成一行。整个 table 每个 suitid 都有副本,因此它看起来像下面这样。

BLDGID  LEASID  SUITID  INCCAT  Jan Feb Mar Apr May June    Jul Aug Sept    Oct Nov Dec
87000   100      AZ1    TAD     800 800                                     
87000   200      AZ2    TAD             900                                 
87000   300      AZ3    TAD                         1000                    
88000   400      AZ4    TAD                                 100                 
89000   500      AZ5    TAD                                          200            
89000   600      AZ6    TAD                                                     900 
90000   700      AZ7    TAD                                                         500
90000   800      AZ8    TAD         950                 

您的查询就快完成了,尝试像这样重建它:

SELECT *
FROM (
    SELECT  c.BLDGID AS 'BLDGID', 
            c.LEASID AS 'LEASID', 
            l.OCCPNAME AS 'OCCPNAME', 
            l.SUITID AS 'SUITID', 
            c.INCCAT AS 'INCCAT', 
            c.SRCCODE AS 'SRCCODE', 
            c.TRANAMT AS 'TRANAMT', 
            c.DESCRPTN AS 'DESCRPTN', 
            c.PERIOD AS 'PERIOD'
    FROM SQLDATA.dbo.LEAS l
    INNER JOIN SQLDATA.dbo.CMLEDG c
        ON l.BLDGID = c.BLDGID AND l.LEASID = c.LEASID
    WHERE  c.BLDGID &SPARM01
        AND c.INCCAT &SPARM02 
        AND c.SRCCODE NOT LIKE 'CR'
        AND c.DESCRPTN NOT LIKE 'CREDITAPPLY' 
        AND c.DESCRPTN NOT LIKE 'RECEIPT'
        AND c.PERIOD > '201512'
    ) as t
PIVOT (
    MAX(TRANAMT) 
    FOR PERIOD IN ([201601],[201602],[201603],[201607],[201609],[201611],[201612])
) as REVENUEPERITEM

下面是您如何调整现有数据(我使用 CTE,因为我没有您的表格):

;WITH cte AS (
SELECT *
FROM (VALUES
(87000,   100,     'AZ1',        'TAD',    800,   '201601'),
(87000,   200,     'AZ2',        'TAD',    900,   '201603'),
(87000,   300,     'AZ3',        'TAD',    100,   '201607'),
(88000,   400,     'AZ4',        'TAD',    100,   '201607'),                                     
(89000,   500,     'AZ5',        'TAD',    200,   '201609'),
(89000,   600,     'AZ6',        'TAD',    900,   '201611'),
(90000,   700,     'AZ7',        'TAD',    500,   '201612'),
(90000,   800,     'AZ8',        'TAD',    950,   '201602')
) as t([BLDGID], [LEASID], [SUITID], [INCCAT], [AMOUNT], [PERIOD])
)

SELECT *
FROM cte
PIVOT (
    MAX([AMOUNT]) FOR [PERIOD] IN ([201601],[201602],[201603],[201604])
) pvt

输出:

BLDGID  LEASID  SUITID  INCCAT  201601  201602  201603  201604
87000   100     AZ1     TAD     800     NULL    NULL    NULL
87000   200     AZ2     TAD     NULL    NULL    900     NULL
87000   300     AZ3     TAD     NULL    NULL    NULL    NULL
88000   400     AZ4     TAD     NULL    NULL    NULL    NULL
89000   500     AZ5     TAD     NULL    NULL    NULL    NULL
89000   600     AZ6     TAD     NULL    NULL    NULL    NULL
90000   700     AZ7     TAD     NULL    NULL    NULL    NULL
90000   800     AZ8     TAD     NULL    950     NULL    NULL