я получил следующий запрос:SQL Pivot с динамическими генерируемыми столбцами, агрегатной функции и столбцы без агрегации
WITH preEKBE AS(
SELECT
EKPO . MANDT,
EKPO . EBELN,
EKPO . EBELP,
DD07T.DDTEXT AS c_Meaning,
EKBE . VGABE,
EKBE . DMBTR,
EKBE . MENGE,
COUNT(VGABE) OVER(PARTITION BY EKBE . EBELN, EKBE . EBELP, ZEKKN) AS c_COUNT,
CONVERT (varchar(10),MIN(EKBE . BLDAT) OVER (PARTITION BY EKBE . EBELN, EKBE . EBELP, EKBE . VGABE),104) AS c_EBKE_BLDAT_First,
CONVERT (varchar(10),MIN(EKBE . BUDAT) OVER (PARTITION BY EKBE . EBELN, EKBE . EBELP, EKBE . VGABE),104) AS c_EKBE_BUDAT_First,
CONVERT (varchar(10),MAX(EKBE . BLDAT) OVER (PARTITION BY EKBE . EBELN, EKBE . EBELP, EKBE . VGABE),104) AS c_EBKE_BLDAT_Last,
CONVERT (varchar(10),MAX(EKBE . BUDAT) OVER (PARTITION BY EKBE . EBELN, EKBE . EBELP, EKBE . VGABE),104) AS c_EKBE_BUDAT_Last
FROM EKPO
LEFT JOIN EKKO
ON EKPO . MANDT = EKKO . MANDT
AND EKPO . EBELN = EKKO . EBELN
LEFT JOIN EKBE
ON EKPO . MANDT = EKBE . MANDT
AND EKPO . EBELN = EKBE . EBELN
AND EKPO . EBELP = EKBE . EBELP
LEFT JOIN DD07T
ON DD07T . DOMNAME = 'VGABE'
AND DD07T . DOMVALUE_L = EKBE.VGABE
AND DD07T . DDLANGUAGE = 'D'
)
SELECT * INTO #preEKBE FROM preEKBE
ORDER BY EBELN , EBELP
Он генерирует мне эту таблицу
+-------+------------+-------+-----------------------------+-------+---------+----------+---------+--------------------+--------------------+-------------------+-------------------+
| MANDT | EBELN | EBELP | c_Meaning | VGABE | DMBTR | MENGE | c_COUNT | c_EBKE_BLDAT_First | c_EKBE_BUDAT_First | c_EBKE_BLDAT_Last | c_EKBE_BUDAT_Last |
+-------+------------+-------+-----------------------------+-------+---------+----------+---------+--------------------+--------------------+-------------------+-------------------+
| 800 | 3000000004 | 00001 | Wareneingang | 1 | 27.95 | 1.000 | 1 | 19.12.2000 | 19.12.2000 | 19.12.2000 | 19.12.2000 |
| 800 | 3000000004 | 00001 | Rechnungseingang | 2 | 27.95 | 1.000 | 1 | 19.12.2000 | 21.12.2000 | 19.12.2000 | 21.12.2000 |
| 800 | 3000000004 | 00002 | Wareneingang | 1 | 10.95 | 1.000 | 1 | 19.12.2000 | 19.12.2000 | 19.12.2000 | 19.12.2000 |
| 800 | 3000000004 | 00002 | Rechnungseingang | 2 | 10.95 | 1.000 | 1 | 19.12.2000 | 21.12.2000 | 19.12.2000 | 21.12.2000 |
| 800 | 4500008499 | 00010 | Wareneingang | 1 | 268.43 | 1.000 | 1 | 27.03.2000 | 27.03.2000 | 27.03.2000 | 27.03.2000 |
| 800 | 4500008499 | 00010 | Leistungserfassungsblatt | 9 | 268.43 | 1.000 | 1 | 27.03.2000 | 27.03.2000 | 27.03.2000 | 27.03.2000 |
| 800 | 4500010470 | 00010 | Wareneingang | 1 | 0.00 | 1092.000 | 6 | 07.02.2001 | 07.02.2001 | 07.02.2001 | 07.02.2001 |
| 800 | 4500010470 | 00010 | Wareneingang | 1 | 0.00 | 3512.000 | 6 | 07.02.2001 | 07.02.2001 | 07.02.2001 | 07.02.2001 |
| 800 | 4500010470 | 00010 | Warenausgabe für Umlagerung | 6 | 1615.52 | 3512.000 | 6 | 07.02.2001 | 07.02.2001 | 07.02.2001 | 07.02.2001 |
| 800 | 4500010470 | 00010 | Warenausgabe für Umlagerung | 6 | 502.32 | 1092.000 | 6 | 07.02.2001 | 07.02.2001 | 07.02.2001 | 07.02.2001 |
| 800 | 4500010470 | 00010 | Lieferung zu Umlagerung | 8 | 0.00 | 1092.000 | 6 | 01.01.1900 | 07.02.2001 | 01.01.1900 | 07.02.2001 |
| 800 | 4500010470 | 00010 | Lieferung zu Umlagerung | 8 | 0.00 | 3512.000 | 6 | 01.01.1900 | 07.02.2001 | 01.01.1900 | 07.02.2001 |
+-------+------------+-------+-----------------------------+-------+---------+----------+---------+--------------------+--------------------+-------------------+-------------------+
Теперь у меня динамический Pivot что частично работает.
DECLARE @cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT ',' + QUOTENAME(col + '_' + VGABE)
from #preEKBE t
cross apply
(
select 'c_DMBTR', 1 union all
select 'c_MENGE', 2 union all
select 'c_COUNT', 3
) c (col, so)
group by col, so, VGABE
order by VGABE, so
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
set @query
= 'SELECT EBELN, EBELP,' + @cols + N'
from
(
select
t.EBELN,
t.EBELP,
new_col = c.orig_col + ''_'' + VGABE,
c.value
from #preEKBE t
cross apply
(
select ''c_MENGE'', t.MENGE union all
select ''c_DMBTR'', t.DMBTR union all
select ''c_COUNT'', t.c_COUNT
) c (orig_col, value)
) x
pivot
(
sum(value)
for new_col in (' + @cols + N')
) p
order by EBELN , EBELP'
exec sp_executesql @query;
Давая мне результат:
+------------+-------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+
| EBELN | EBELP | c_DMBTR_1 | c_MENGE_1 | c_COUNT_1 | c_DMBTR_2 | c_MENGE_2 | c_COUNT_2 | c_DMBTR_6 | c_MENGE_6 | c_COUNT_6 | c_DMBTR_7 | c_MENGE_7 | c_COUNT_7 | c_DMBTR_8 | c_MENGE_8 | c_COUNT_8 | c_DMBTR_9 | c_MENGE_9 | c_COUNT_9 | c_DMBTR_P | c_MENGE_P | c_COUNT_P | c_DMBTR_R | c_MENGE_R | c_COUNT_R |
+------------+-------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+
| 3000000004 | 00001 | 27.950 | 1.000 | 1.000 | 27.950 | 1.000 | 1.000 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
| 3000000004 | 00002 | 10.950 | 1.000 | 1.000 | 10.950 | 1.000 | 1.000 | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL | NULL |
+------------+-------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+
Мне нужен запрос, чтобы быть динамичным из-за колонны VGABE
, чтобы создать новые имена столбцов и могут быть значения, которые не используются, и я только хотите использовать значения VGABE
.
Теперь проблема в том, что я хочу добавить больше столбцов, которые также должны генерироваться динамически. Когда есть VGABE
с номером 1, мне нужен столбец с именем c_Meaning_1 (nvarchar)
, и он будет иметь значение из объединения с DD07T
.
c_COUNT_
означает количество каждого VGABE
Значение на запись. Эта колонка отлично работает.
После этих колонн я также нужно добавить столбцы c_BLDAT_First_
, c_BUDAT_First_
, c_BLDAT_Last_
и c_BUDAT_Last_
со значением VGABE
каскадного на конец нового имени столбца. Это значение рассчитывается в CTE.
Есть ли способ использовать CTE непосредственно без временной таблицы?
Я не уверен, как это решить, поскольку я имею дело с несколькими типами данных, и каждый из них будет агрегироваться по-разному. При наличии значение 1 и 9 для VGABE
, то он должен выглядеть следующим образом:
+---------------+-----------+-----------+-----------+----------------------+----------------------+---------------------+---------------------+---------------------------+------------+-----------+-----------+----------------------+----------------------+---------------------+---------------------+
| C_MEANING_1 | C_DMBTR_1 | C_MENGE_1 | C_COUNT_1 | C_EBKE_BLDAT_FIRST_1 | C_EKBE_BUDAT_FIRST_1 | C_EBKE_BLDAT_LAST_1 | C_EKBE_BUDAT_LAST_1 | C_MEANING_9 | C_DMBTR_9 | C_MENGE_9 | C_COUNT_9 | C_EBKE_BLDAT_FIRST_9 | C_EKBE_BUDAT_FIRST_9 | C_EBKE_BLDAT_LAST_9 | C_EKBE_BUDAT_LAST_9 |
+---------------+-----------+-----------+-----------+----------------------+----------------------+---------------------+---------------------+---------------------------+------------+-----------+-----------+----------------------+----------------------+---------------------+---------------------+
| Wareneingang: | 10,00 | 1 | 1 | 19.12.2000 | 19.12.2000 | 19.12.2000 | 19.12.2000 | Leistungserfassungsblatt: | 0 | 0 | 0 | NULL | NULL | NULL | NULL |
| Wareneingang: | 0 | 0 | 0 | NULL | NULL | NULL | NULL | Leistungserfassungsblatt: | 20 | 2 | 1 | 19.12.2000 | 19.12.2000 | 19.12.2000 | 19.12.2000 |
+---------------+-----------+-----------+-----------+----------------------+----------------------+---------------------+---------------------+---------------------------+------------+-----------+-----------+----------------------+----------------------+---------------------+---------------------+
Для каждого VGABE
значения должна быть собственный столбец в порядке, указанном выше. Если вам нужна дополнительная информация, просто спросите меня, пожалуйста. Я использую SQL Server 2014 с SQL Management Studio 2014 и TSQL.
Может быть, я не в полной мере понять вопрос, но если вы хотите возвращать только строки, связанные с 'VGABE = 1', то вы должны быть в состоянии добавить' WHERE' фильтр для генерации динамического столбца. Затем вы также включите другие столбцы, которые вы хотите ('c_EBKE_BLDAT_First',' c_EKBE_BUDAT_First' и т. Д.) В вашем подзапросе сводной таблицы и окончательного списка выбора, подобном этому [demo] (http://sqlfiddle.com/# ! 3/58e57/7). Если это не то, что вы хотите, тогда вам, возможно, придется обновить вопрос, чтобы он стал более понятным. – Taryn
Запрос должен делать столбцы для каждого значения в VGABE. Поэтому, когда в VGABE есть значения (1,3,7, R), он должен создавать столбцы, начинающиеся с самого низкого значения _-> c_Meaning_X c_DMBTR_X c_MENGE_X c_COUNT_X c c_BLDAT_First_X c_BUDAT_First_X c_BLDAT_Last_X c_BUDAT_Last_X (где X означает значение в VGABE). Колонки должны быть в этом порядке. – JollyPopper
Трудность здесь заключается в том, что содержимое c_Meaning_X зависит от значения в VGABE и находится в таблице DD07T (join). Если есть, например, VGABE 9, тогда для каждой записи необходимо создать столбец c_Meaning_9 с содержимым «Leistungserfassungsblatt» из DD07T.DDTEXT для каждой записи, есть ли только одна запись с vgabe 9, а в других нет. – JollyPopper