SELECT von MYSQL nach MSSQL

MysterioJN

SQL-Guru
Beiträge
158
Hey ihr Lieben,

unsere Vertriebs-Datenbank ist nun von MYSQL zu MSSQL umgezogen.

Bisher haben wir Nachts immer eine Tabelle gelöscht und neu erzeugt mittels folgendem Select:
Code:
select
aid_artikel.anr AS BstNr,
aid_artikel.titel AS Titel,
aid_artikel.traeger_na AS Traeger,
aid_artikel.ag AS Redaktion,
aid_artikel.redaktion AS Redakteur,
aid_artikel.mnr AS MelNr,
tbltagebestand.Tage_Vertrieb_Gesamt AS VerTage,
artikel.bestand AS BHLag,
lagersperrlager.bestand AS BSLag,
artikel.bedarf AS Vormer,
artikel.meldeb AS Warn,
If(artikel.meldeb >= artikel.bestand, "ja","nein") AS Warn_er,
If(Artikel.lbanr<>Artikel.anr,Artikel.lbanr,"") AS Paar,
round(sum(CASE WHEN tab.art = 'selektiert' THEN tab.ST else 0 END) - sum(CASE WHEN tab.art = 'storniert' THEN tab.ST else 0 END),0) as Absatz,
round(sum(CASE WHEN tab.art = 'selektiert' THEN tab.ST else 0 END) - sum(CASE WHEN tab.art = 'storniert' THEN tab.ST else 0 END),0) / tbltagebestand.Tage_Vertrieb_Gesamt AS dAT,

round((artikel.bestand / (round(sum(CASE WHEN tab.art = 'selektiert' THEN tab.ST else 0 END) - sum(CASE WHEN tab.art = 'storniert' THEN tab.ST else 0 END),0) / tbltagebestand.Tage_Vertrieb_Gesamt)),0) AS VerfTage,

DATE_ADD(curdate(),Interval (artikel.bestand / (round(sum(CASE WHEN tab.art = 'selektiert' THEN tab.ST else 0 END) - sum(CASE WHEN tab.art = 'storniert' THEN tab.ST else 0 END),0) / tbltagebestand.Tage_Vertrieb_Gesamt)) DAY) as VerfBis

FROM aid_artikel LEFT JOIN artikel ON aid_artikel.anr = artikel.anr LEFT JOIN tab ON aid_artikel.anr = tab.anr LEFT JOIN tbltagebestand ON aid_artikel.anr = tbltagebestand.BstNr LEFT Join lagersperrlager ON aid_artikel.aken = lagersperrlager.aken

WHERE artikel.bestand <5000000 AND aid_artikel.status = 'aktuell'
GROUP BY aid_artikel.anr
order by artikel.bedarf DESC

Das hat Prima geklappt.

Nun muss der Select auch auf MSSQL funktionieren. Ein paar Dinge habe ich schon abändern (blau gekennzeichnet) können:

select
aid_artikel.anr AS BstNr,
aid_artikel.titel AS Titel,
aid_artikel.traeger_na AS Traeger,
aid_artikel.ag AS Redaktion,
aid_artikel.redaktion AS Redakteur,
aid_artikel.mnr AS MelNr,
tbltagebestand.Tage_Vertrieb_Gesamt AS VerTage,
artikel.bestand AS BHLag,
lagersperrlager.bestand AS BSLag,
artikel.bedarf AS Vormer,
artikel.meldeb AS Warn,

IIf(artikel.meldeb >= artikel.bestand, 'ja', 'nein') AS Warn_er,
IIf(Artikel.lbanr<>Artikel.anr, Artikel.lbanr, '') AS Paar,


round(sum(CASE WHEN tab.art = 'selektiert' THEN tab.ST else 0 END) - sum(CASE WHEN tab.art = 'storniert' THEN tab.ST else 0 END),0) as Absatz,

round(sum(CASE WHEN tab.art = 'selektiert' THEN tab.ST else 0 END) - sum(CASE WHEN tab.art = 'storniert' THEN tab.ST else 0 END),0) / tbltagebestand.Tage_Vertrieb_Gesamt AS dAT,

round((artikel.bestand / (round(sum(CASE WHEN tab.art = 'selektiert' THEN tab.ST else 0 END) - sum(CASE WHEN tab.art = 'storniert' THEN tab.ST else 0 END),0) / tbltagebestand.Tage_Vertrieb_Gesamt)),0) AS VerfTage,

getdate() + (artikel.bestand / (round(sum(CASE WHEN tab.art = 'selektiert' THEN tab.ST else 0 END) - sum(CASE WHEN tab.art = 'storniert' THEN tab.ST else 0 END),0) / tbltagebestand.Tage_Vertrieb_Gesamt)) AS VerfBis

FROM aid_artikel LEFT JOIN artikel ON aid_artikel.anr = artikel.anr LEFT JOIN tab ON aid_artikel.anr = tab.anr LEFT JOIN tbltagebestand ON aid_artikel.anr = tbltagebestand.BstNr LEFT Join lagersperrlager ON aid_artikel.aken = lagersperrlager.aken

WHERE artikel.bestand <5000000 AND aid_artikel.status = 'aktuell'
GROUP BY aid_artikel.anr
ORDER BY artikel.bedarf DESC



Wenn ich das ausführen will, kommt folgende Fehlermeldung:


Die aid_artikel.titel-Spalte ist in der Auswahlliste ungültig, da sie nicht in einer Aggregatfunktion und nicht in der GROUP BY-Klausel enthalten ist.


Warum verlangt er das von mir? Das hat es mit den gleichen Daten auf dem MYSQL auch nicht interessiert. Ich kann doch nicht alles in GROUP BY setzen, zumal da ja auch "eigens erzeugte Spalten" (quasi alle Berechnungen) dabei sind die ich ja namentlich nicht ansprechen kann... grrr


 
Werbung:
Das wird auch mit zukünftigen MySQL-Versionen nicht funktionieren, das Select ist inhaltlich / logisch falsch. Deine 'berechneten' Spalten sind Aggregationen, daher müssen im Resultat alle Spalten entweder aggregiert oder gruppiert sein. MySQL hat Dir bis jetzt zufällige Resultate geliefert.
 
Werbung:
Also das If() würde ich durch CASE WHEN ersetzen, das dateadd() schreibt sich bei MSSQL zusammen.

Ansonsten hat akretschmer schon recht, dein Query ist syntaktisch falsch und natürlich kann MSSQL von dir eine richtige Syntax erwarten :) Um die berechneten Spalten komfortabler zu verwenden kannst du auch einen Select drum herum machen und den das GROUP BY durchführen lassen.
 
Zurück
Oben