这是SQL Server的新手,这时我想使用带有数据透视表的查询,但是有些困难,是否可以帮助我找到我喜欢的错误。问候在第一部分中,我创建了一个名为DateTemp
的虚拟表,我将两个表DateTemp
和datcpc
表联接在一起,现在我想使用数据透视表,但是我在枢纽部分附近出现错误。
我的代码:
// First Part
DECLARE @StartDate datetime
DECLARE @EndDate datetime
SELECT @StartDate = '2018-01-01', @EndDate = '2018-11-08'
SELECT @StartDate = @StartDate - (DATEPART(DD, @StartDate) - 1)
DECLARE @DateTemp TABLE (TheDate DATETIME)
WHILE (@StartDate <= @EndDate)
BEGIN
INSERT INTO @DateTemp
VALUES (@StartDate)
SELECT @StartDate = DATEADD(DAY, 1, @StartDate)
END
// Second part
SELECT
CYALA, CYALB
FROM
(SELECT DISTINCT
fechab 'FECHA', clapla 'CLAVEPLANTA', clapro 'CLAVE PRODUCTO',
CAST(SUM(cantid) AS NUMERIC(9, 2)) 'ACTIVIDAD'
FROM
(datcpc
LEFT JOIN
(SELECT TheDate
FROM @DateTemp
WHERE TheDate >= '05/01/2018') NT ON datcpc.fechab = NT.TheDate)
WHERE
datcpc.fechab >= '01/05/2018'
AND datcpc.fechab >= '01/05/2018'
AND (clapla = 'CYALA' OR clapla = 'CYALB' OR clapla = 'CYAZC')
AND datcpc.tipflu = 'C'
GROUP BY
fechab, clapla, clapro) AS SOURCE
PIVOT
(SUM(SOURCE.ACTIVIDAD)
FOR SOURCE.CLAVEPLANTA IN (CYALA, CYALB)
) AS PIVOTABLE
测试建议的答案,没有成功。尝试一个简单的示例,即使错误被设置为“ System.Data.SqlClient.SqlException:'第1行:'PIVOT'附近的语法不正确。'”,我不知道这是服务器配置还是它的相关内容。我通过SqlConnection通过Visual Studio 2017使用到服务器的连接,下面列出了新的简单代码
SELECT DISTINCT [CLAVEPLANTA], [ACTIVIDAD]
FROM(
SELECT fechab AS [FECHA], clapla AS [CLAVEPLANTA], CAST(SUM(cantid) AS NUMERIC(9,2) ) AS [ACTIVIDAD] FROM datcpc"
WHERE datcpc.fechab >= '01/05/2018'
AND (clapla='CYALA' OR clapla='CYALB' OR clapla='CYAZC')
GROUP BY fechab, clapla
) AS [SO]
PIVOT(SUM([SO.ACTIVIDAD]) FOR [SO.CLAVEPLANTA] IN ([CYALA], [CYALB])) AS [PVT];
我真的很感谢您的帮助
答案 0 :(得分:0)
我将提供“动力枢轴”的两个变体,希望对您有帮助:
一些示例数据:
create table temp
(
date datetime,
category varchar(3),
amount money
)
insert into temp values ('1/1/2012', 'ABC', 1000.00)
insert into temp values ('2/1/2012', 'DEF', 500.00)
insert into temp values ('2/1/2012', 'GHI', 800.00)
insert into temp values ('2/10/2012', 'DEF', 700.00)
insert into temp values ('3/1/2012', 'ABC', 1100.00)
现在有一个查询,它将每天将数据“透视”成列:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(convert(char(10), c.[date],121))
FROM temp c
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT category, ' + @cols + ' from
(
select convert(char(10), [date],121) [date]
, amount
, category
from temp
) x
pivot
(
sum(amount)
for [date] in (' + @cols + ')
) p '
execute(@query)
结果如下:
+----------+------------+------------+------------+------------+
| category | 2012-01-01 | 2012-02-01 | 2012-02-10 | 2012-03-01 |
+----------+------------+------------+------------+------------+
| ABC | 1000,0000 | NULL | NULL | 1100,0000 |
| DEF | NULL | 500,0000 | 700,0000 | NULL |
| GHI | NULL | 800,0000 | NULL | NULL |
+----------+------------+------------+------------+------------+
现在,此查询将“类别”分类为列:
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.category)
FROM temp c
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query = 'SELECT convert(char(10),date,121) date, ' + @cols + ' from
(
select date
, amount
, category
from temp
) x
pivot
(
max(amount)
for category in (' + @cols + ')
) p '
execute(@query)
结果如下:
+------------+-----------+----------+----------+
| date | ABC | DEF | GHI |
+------------+-----------+----------+----------+
| 2012-01-01 | 1000,0000 | NULL | NULL |
| 2012-02-01 | NULL | 500,0000 | 800,0000 |
| 2012-02-10 | NULL | 700,0000 | NULL |
| 2012-03-01 | 1100,0000 | NULL | NULL |
+------------+-----------+----------+----------+
一些建议:
--Second part
SELECT
CYALA,CYALB -- you need to specify more columns here
FROM (
SELECT DISTINCT -- distinct is not needed when grouping, remove this
fechab 'FECHA'
,clapla 'CLAVEPLANTA'
,clapro 'CLAVE PRODUCTO'
,CAST(SUM(cantid) AS numeric(9, 2)) 'ACTIVIDAD'
/* if you are creating the temporal table to get EVERY date
, then @DateTemp should be the base table, and left join the [datcpc] */
FROM (datcpc
LEFT JOIN (
SELECT
TheDate
FROM @DateTemp
WHERE TheDate >= '05/01/2018' -- use YYYMMDD or YYYY-MM-DD consistently
) NT
ON datcpc.fechab = NT.TheDate)
WHERE datcpc.fechab >= '01/05/2018'
AND datcpc.fechab >= '01/05/2018' -- repeated, not needed
AND clapla IN('CYALA','CYALB','CYAZC') -- use IN()
AND datcpc.tipflu = 'C'
GROUP BY
fechab ,clapla ,clapro
) AS SOURCE
PIVOT (
SUM(SOURCE.ACTIVIDAD)
FOR SOURCE.CLAVEPLANTA IN (CYALA, CYALB) -- did you want dates here? (as the pivot columns)
) AS PIVOTABLE