Я собираюсь предоставить 2 варианта «динамического поворота», который, я надеюсь, поможет:
Некоторые примеры данных:
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