MSSQL Frage
Geizhals » Forum » Programmierung » MSSQL Frage (18 Beiträge, 185 Mal gelesen) Top-100 | Fresh-100
Du bist nicht angemeldet. [ Login/Registrieren ]
..
Re(2): MSSQL Frage
14.04.2010, 14:08:34
danke vorweg...

das habe ich bereits angefangen mit case abzufragen... funktioniert an sich auch recht gut, aber:

da an sich jede spalte von der vorigen Spalte abhängig ist (und es noch 9 weitere Spalten gibt) werden die CASE Bedingungen ziemlich groß je weiter die Spalte nach rechts rückt.

Hab das mal jetzt so zambaut:

SELECT T0.ItemCode, T1.OnHand,
case when (Select sum(m1) from eingang0to30 where itemcode = t0.itemcode group by itemcode) > t1.onhand then t1.onhand else (Select sum(m1) from eingang0to30 where itemcode = t0.itemcode group by itemcode) end AS [0-30],
case when ((Select sum(m2) from eingang30to60 where itemcode = t0.itemcode group by itemcode)+(Select sum(m1) from eingang0to30 where itemcode = t0.itemcode group by itemcode))> t1.onhand then '0' else (Select sum(m2) from eingang30to60 where itemcode = t0.itemcode group by itemcode) end AS [30-60]
FROM OITM T0  INNER JOIN OITW T1 ON T0.ItemCode = T1.ItemCode
WHERE T1.OnHand > 0 ORDER BY T1.ItemCode ASC

wobei in der 4. Spalte (in der 30-60) noch nicht der maximalwert der onhand abgefangen wird.
Wenn Ich nun das Gedankenspiel weiterspiele (also auf weitere 7 Spalten), dann wird die Abfrage ziemlich mächtig.

Ist die Frage ob ich hier nicht über noch eine weitere View gehen sollte... nur in einer Abfrage eine View einer View abfragen... hmm... was denkst du bzw. weißt du wie es hier performancetechnisch ausschaut?

oder vielleicht eine andere idee das Ganze schlanker zu gestalten?

danke




x-x-o
o-x-o
o-o-x ... and the winner is x
14.04.2010, 14:15 Uhr - Editiert von blitzfreak, alte Version: hier
Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
....
Re(4): MSSQL Frage
15.04.2010, 17:33:30
danke... habe ich im endeffekt eh bereits gestern so gelöst :)

im endeffekt ist die abfrage beruhend auf 6 Views (für die Datumbereiche) fertig und sieht folgendermaßen aus:

SELECT T0.ItemCode, T0.ItemName, T2.ItmsGrpNam, T1.OnHand, T0.AvgPrice*T1.OnHand AS [Artikelkosten],
CASE WHEN t20.summ0 > T1.OnHand THEN T1.OnHand
ELSE t20.summ0 END AS [0-30],
CASE WHEN coalesce(t21.summ1,0)+coalesce(t20.summ0,0) > T1.OnHand AND T1.OnHand - coalesce(t20.summ0,0) > 0 THEN T1.OnHand - coalesce(t20.summ0,0)
WHEN coalesce(t21.summ1,0)+coalesce(t20.summ0,0) > T1.OnHand AND T1.OnHand - coalesce(t20.summ0,0) <= 0 THEN NULL
WHEN coalesce(t21.summ1,0)+coalesce(t20.summ0,0) <= T1.OnHand THEN t21.summ1
ELSE '9999' END AS [30-60],
CASE WHEN coalesce(t22.summ2,0)+coalesce(t21.summ1,0)+coalesce(t20.summ0,0) > T1.OnHand AND T1.OnHand - coalesce(t20.summ0,0) - coalesce(t21.summ1,0) > 0 THEN T1.OnHand - coalesce(t20.summ0,0) - coalesce(t21.summ1,0)
WHEN coalesce(t22.summ2,0)+coalesce(t21.summ1,0)+coalesce(t20.summ0,0) > T1.OnHand AND T1.OnHand - coalesce(t20.summ0,0) - coalesce(t21.summ1,0) <= 0 THEN NULL
WHEN coalesce(t22.summ2,0)+coalesce(t21.summ1,0)+coalesce(t20.summ0,0) <= T1.OnHand THEN t22.summ2
ELSE '9999' END AS [60-90],
CASE WHEN coalesce(t23.summ3,0)+coalesce(t22.summ2,0)+coalesce(t21.summ1,0)+coalesce(t20.summ0,0) > T1.OnHand AND T1.OnHand - coalesce(t20.summ0,0) - coalesce(t21.summ1,0) - coalesce(t22.summ2,0) > 0 THEN T1.OnHand - coalesce(t20.summ0,0) - coalesce(t21.summ1,0) - coalesce(t22.summ2,0)
WHEN coalesce(t23.summ3,0)+coalesce(t22.summ2,0)+coalesce(t21.summ1,0)+coalesce(t20.summ0,0) > T1.OnHand AND T1.OnHand - coalesce(t20.summ0,0) - coalesce(t21.summ1,0) - coalesce(t22.summ2,0) <= 0 THEN NULL
WHEN coalesce(t23.summ3,0)+coalesce(t22.summ2,0)+coalesce(t21.summ1,0)+coalesce(t20.summ0,0) <= T1.OnHand THEN t23.summ3
ELSE '9999' END AS [90-120],
CASE WHEN coalesce(t24.summ4,0)+coalesce(t23.summ3,0)+coalesce(t22.summ2,0)+coalesce(t21.summ1,0)+coalesce(t20.summ0,0) > T1.OnHand AND T1.OnHand - coalesce(t20.summ0,0) - coalesce(t21.summ1,0) - coalesce(t22.summ2,0) - coalesce(t23.summ3,0) > 0 THEN T1.OnHand - coalesce(t20.summ0,0) - coalesce(t21.summ1,0) - coalesce(t22.summ2,0) - coalesce(t23.summ3,0)
WHEN coalesce(t24.summ4,0)+coalesce(t23.summ3,0)+coalesce(t22.summ2,0)+coalesce(t21.summ1,0)+coalesce(t20.summ0,0) > T1.OnHand AND T1.OnHand - coalesce(t20.summ0,0) - coalesce(t21.summ1,0) - coalesce(t22.summ2,0) - coalesce(t23.summ3,0) <= 0 THEN NULL
WHEN coalesce(t24.summ4,0)+coalesce(t23.summ3,0)+coalesce(t22.summ2,0)+coalesce(t21.summ1,0)+coalesce(t20.summ0,0) <= T1.OnHand THEN t24.summ4
ELSE '9999' END AS [120-180],
CASE WHEN coalesce(t25.summ5,0)+coalesce(t24.summ4,0)+coalesce(t23.summ3,0)+coalesce(t22.summ2,0)+coalesce(t21.summ1,0)+coalesce(t20.summ0,0) > T1.OnHand AND T1.OnHand - coalesce(t20.summ0,0) - coalesce(t21.summ1,0) - coalesce(t22.summ2,0) - coalesce(t23.summ3,0) - coalesce(t24.summ4,0) > 0 THEN T1.OnHand - coalesce(t20.summ0,0) - coalesce(t21.summ1,0) - coalesce(t22.summ2,0) - coalesce(t23.summ3,0) - coalesce(t24.summ4,0)
WHEN coalesce(t25.summ5,0)+coalesce(t24.summ4,0)+coalesce(t23.summ3,0)+coalesce(t22.summ2,0)+coalesce(t21.summ1,0)+coalesce(t20.summ0,0) > T1.OnHand AND T1.OnHand - coalesce(t20.summ0,0) - coalesce(t21.summ1,0) - coalesce(t22.summ2,0) - coalesce(t23.summ3,0) - coalesce(t24.summ4,0) <= 0 THEN NULL
WHEN coalesce(t25.summ5,0)+coalesce(t24.summ4,0)+coalesce(t23.summ3,0)+coalesce(t22.summ2,0)+coalesce(t21.summ1,0)+coalesce(t20.summ0,0) <= T1.OnHand THEN t25.summ5
ELSE '9999' END AS [> 180]
FROM OITM T0
INNER JOIN OITW T1 ON T0.ItemCode = T1.ItemCode
INNER JOIN OITB T2 ON T0.ItmsGrpCod = T2.ItmsGrpCod
left join eingang0to30 t20 on t0.itemcode = t20.itemcode
left join eingang30to60 t21 on t0.itemcode = t21.itemcode
left join eingang60to90 t22 on t0.itemcode = t22.itemcode
left join eingang90to120 t23 on t0.itemcode = t23.itemcode
left join eingang120to180 t24 on t0.itemcode = t24.itemcode
left join eingang180andup t25 on t0.itemcode = t25.itemcode
WHERE T1.OnHand > 0 ORDER BY T1.ItemCode ASC

hätt mir zwar gerne die caolesce immer erspart, aber ich habe einfach keine bessere Variante gefunden (da die views ja auch NULLs zurückliefern aber die Addition bzw. Subtraktion trotzdem funktionieren soll).

egal... das Endergebnis zählt :) und trotz der 6 Views über ziemlich große Datensätze ist das Teil noch performant :)

danke nochmals für deine Tipps.


x-x-o
o-x-o
o-o-x ... and the winner is x
15.04.2010, 17:35 Uhr - Editiert von blitzfreak, alte Version: hier
Antworten PM Übersicht Chronologisch Zum Vorgänger
 
Melden nicht möglich
 

Dieses Forum ist eine frei zugängliche Diskussionsplattform.
Der Betreiber übernimmt keine Verantwortung für den Inhalt der Beiträge und behält sich das Recht vor, Beiträge mit rechtswidrigem oder anstößigem Inhalt zu löschen.
Datenschutzerklärung