Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 尝试透视时出现数据错误_Sql_Sql Server_Pivot - Fatal编程技术网

Sql 尝试透视时出现数据错误

Sql 尝试透视时出现数据错误,sql,sql-server,pivot,Sql,Sql Server,Pivot,正在尝试在SQL Server中透视数据。以前从未写过这样的东西 现在的情况如何(每个类别都有上百个类别,请记住这一点和您的建议) 我希望它看起来怎么样 BLDGID LEASID SUITID INCCAT Jan Feb Mar Apr May June Jul Aug Sept Oct Nov Dec 87000 100 AZ1 TAD 800 87000

正在尝试在SQL Server中透视数据。以前从未写过这样的东西

现在的情况如何(每个类别都有上百个类别,请记住这一点和您的建议)

我希望它看起来怎么样

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                                     
我一直在尝试的代码(不确定我是否在正确的轨道上)

请参见底部的编辑

作为旁注,我们在工作中使用了一个特殊的程序,您看到的东西都是该程序的项目,允许我编辑查询而无需重新编写

我遇到的问题是一个错误

SQL语句中有错误,透视分组列必须具有可比性。“ADDLDESC”列的类型为“text”,这是不可比较的

新编辑从何处开始

我目前的结果与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行如何具有相同的SuiteID,我想将它们合并为一行。整个表都有每个SuiteID的副本,因此看起来如下所示

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,因为我没有您的表格):

输出:

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

你有几次月经?我看到您正试图根据句点将每一行与一列进行匹配,因此您实际上不需要max和所有这些数据透视-您可以编写一个庞大而难看的case语句。我正在尝试按SuiteID合并数据,这样我就不会为每一个句点列的每一行指定单独的行。当我使用GROUPBY时,我会得到错误,它告诉我我的错误在轴的末尾,它说的是revenueperitem。建议?您可以在子查询中使用group by和聚合函数,在透视部分您可以使用max、sum、avg和其他函数,所以您可能需要在透视部分将max更改为sum?您到底需要分组什么?你能把这个添加到你的问题中吗?请看我对底部整个问题的编辑。我不想删除这个问题的任何部分,因为这个网站是一个圣杯,告诉你当你还不熟悉这个网站的时候该怎么做。这很奇怪。。。我将
(87000100,'AZ1','TAD',800,'201602'),
添加到我的答案中的cte部分,它在'201601'和'201602'中得到AZ1的1行800,这就是为什么我有点困惑的原因。
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
;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