Hallo,
ich bin ziemlich neu auf SQL Server (2008 R2) und Umsteiger von MS Access.
Ich muss eine Abfrage umbauen, bei der ich
1. die Top 100 nach Anzahl ausgeben muss
2. Anzahl als Pivot nach Jahren und eine Gesamtanzahl aller Jahre als Zusatzspalte brauche
3. Zu den 100 Datensätzen noch zusätzlich eine Spalte aus mit einer Anzahl neuer Datensätze benötige, Also ein LEFT JOIN, weil nicht jeder pivotierte Datensatz auch einen neue Einträge hat
4. Zusätzlich eine Spalte mit dem Preis der gesamt pivotierten Datensätze als extra Spalte ausgeben muss
5. Ergebnis muss filterbar sein, sodass nur Datensätz in das Ergebnis kommen, wo die Summer der pivotierten Spalten > einer bestimmten Anzahl ist
Das Query unten ist mein aktueller Stand. Dazu sind ein paar Fragen offen, wo ich um Tipps bitte:
1. Wo ist der beste Platz für die 2 zusätzlichen Spalten. Innerhalb der Abfrae für die PIVOT-Quelle, oder außerhalb als JOIN so wie bei den tNeu in meinem Beispiel?
2. Ist die Ermittlung des Preises eine richtige Variante als Subselect für ein Feld. Oder sollte das auch besser außerhalb vom PIVOT wie bei tNeu gemacht werden?
3. Gibt es eine bessere Möglichkeit, wie ich die Datensätze für eine Gesamtanzahl einschränke als unten nochmals mit einer Funktion die Spalten zusammen zu zählen?
4. Die Sortierung funktioniert derzeit nur am Client. Über SQL werden bei Sortierung nach NrText nicht alle Datensätze zurück gegeben.
Ich weiss, viele Fragen auf einmal. Habe aber versucht mich so weit wie möglich selbst fit zu machen. Jetzt wäre ich dankbar für eure Experten-Tipps.
Danke
Eric
SELECT
Top 100
tPivot.Nr,
tPivot.NrText,
(IsNull([2013],0)+IsNull([2014],0)) AS Gesamt,
AnzahlNeu,
Preis,
[2013],
[2014]
FROM
(
SELECT Nr,
NrText,
MDJ,
COUNT(MDJ) AS Anzahl,
( SELECT SUM(Preis) AS Preis
FROM dbo.t10SAGA AS tPreis
WHERE (tPreis.Nr = t10SAGA.Nr)
AND (MDJ >= 2013)
AND (Marke IN ('xxx'))
AND (Mod3 IN ('yyy'))
GROUP BY Nr
) AS Preis
FROM dbo.t10SAGA
WHERE (Nr IS Not NULL)
AND (MDJ >=2013)
AND (Marke IN ('xxx'))
AND (Mod3 IN ('yyy'))
GROUP BY Nr, NrText, MDJ
)
As tSource
PIVOT
( Max(Anzahl) FOR MDJ IN ([2013],[2014]) )
AS tPivot
LEFT JOIN
(
SELECT Nr, COUNT(MDJ) As AnzahlNeu
FROM dbo.t10SAGA
WHERE Import > CONVERT(DATE, '2013-12-27', 102)
AND (MDJ >=2013)
AND (Nr IS Not NULL)
AND (Marke IN ('xxx'))
AND (Mod3 IN ('yyy'))
GROUP BY Nr
) As tNeu ON tPivot.Nr = tNeu.Nr
WHERE (IsNull([2013],0)+IsNull([2014],0)) > 0
ORDER BY [Gesamt] DESC