ich die folgende Abfrage erhalten haben:SQL Pivot mit dynamisch generierte Spalten, Aggregatfunktion und Spalten ohne Aggregation
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
Es erzeugt mir diese Tabelle
+-------+------------+-------+-----------------------------+-------+---------+----------+---------+--------------------+--------------------+-------------------+-------------------+
| 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 |
+-------+------------+-------+-----------------------------+-------+---------+----------+---------+--------------------+--------------------+-------------------+-------------------+
Jetzt habe ich eine dynamische Pivot bekam das funktioniert teilweise.
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;
mir ein Ergebnis geben:
+------------+-------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+
| 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 |
+------------+-------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+-----------+
Ich brauche die Abfrage dynamisch zu sein, weil der Spalte VGABE
die neuen Spaltennamen zu erstellen und es können Werte sein, die nicht verwendet werden, und ich nur möchte, dass die VGABE
Werte verwendet werden.
Jetzt ist das Problem, dass ich mehr Spalten hinzufügen möchte, die auch dynamisch generiert werden sollten. Wenn es eine VGABE
mit 1 gibt, brauche ich eine Spalte namens c_Meaning_1 (nvarchar)
und es wird den Wert von der Verknüpfung mit DD07T
haben.
Die c_COUNT_
steht für die Anzahl der einzelnen VGABE
Wert pro Datensatz. Diese Spalte funktioniert einwandfrei.
Nach diesen Spalten Ich muß auch die Spalten hinzufügen c_BLDAT_First_
, c_BUDAT_First_
, c_BLDAT_Last_
und c_BUDAT_Last_
mit dem Wert von VGABE
am Ende der neuen Spaltennamen verkettet. Dieser Wert wird im CTE berechnet.
Gibt es eine Möglichkeit, das CTE direkt ohne temporäre Tabelle zu verwenden?
Ich bin mir nicht sicher, wie ich das lösen soll, da ich mit mehreren Datentypen hantiere und sie alle unterschiedlich aggregiert wären. Wenn die Werte 1 und 9 für VGABE
sind dann soll es so aussehen:
+---------------+-----------+-----------+-----------+----------------------+----------------------+---------------------+---------------------+---------------------------+------------+-----------+-----------+----------------------+----------------------+---------------------+---------------------+
| 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 |
+---------------+-----------+-----------+-----------+----------------------+----------------------+---------------------+---------------------+---------------------------+------------+-----------+-----------+----------------------+----------------------+---------------------+---------------------+
Für jeden VGABE
Wert sollte es eine eigene Spalte in der oben angegebenen Reihenfolge sein. Wenn Sie weitere Informationen benötigen, fragen Sie mich bitte. Ich verwende SQL Server 2014 mit SQL Management Studio 2014 und TSQL.
Vielleicht bin ich nicht ganz die Frage verstehen, aber wenn Sie wollen nur Zeilen zurück, die mit 'VGABE = 1 ', dann sollten Sie in der Lage sein, ein' WHERE' hinzufügen Filter auf die dynamische Spaltengenerierung. Dann würden Sie auch die anderen gewünschten Spalten ('c_EBKE_BLDAT_First',' c_EKBE_BUDAT_First', usw.) in Ihre Unterabfrage des Pivots und die endgültige Auswahlliste einbeziehen, die dieser [demo] ähnelt (http://sqlfiddle.com/#). ! 3/58e57/7). Wenn Sie das nicht möchten, müssen Sie die Frage möglicherweise aktualisieren, um sie klarer zu machen. – Taryn
Die Abfrage sollte die Spalten für jeden Wert in VGABE erstellen. Wenn also die Werte (1,3,7, R) in VGABE vorhanden sind, dann sollten die Spalten beginnend mit dem niedrigsten Wert erstellt werden. C_Meaning_X c_DMBTR_X c_MENGE_X c_COUNT_X c_BLDAT_First_X c_BUDAT_First_X c_BLDAT_Last_X c_BUDAT_Last_X (wobei X für den Wert in VGABE steht). Die Spalten müssen in dieser Reihenfolge sein. – JollyPopper
Die knifflige Sache hier zu tun ist, dass der Inhalt in c_Meaning_X von dem Wert in VGABE abhängt und in der Tabelle DD07T (Join) ist. Wenn es zum Beispiel VGABE 9 gibt, dann muss für jeden Datensatz die Spalte c_Meaning_9 mit Inhalt "Leistungserfassungsblatt" aus DD07T.DDTEXT angelegt werden, ob es nur einen Datensatz mit vgabe 9 gibt und in den anderen nicht. – JollyPopper