Sql 尝试透视时出现数据错误
正在尝试在SQL Server中透视数据。以前从未写过这样的东西 现在的情况如何(每个类别都有上百个类别,请记住这一点和您的建议) 我希望它看起来怎么样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
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