尝试旋转时出现数据错误
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
正在尝试在 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