MSSQL > Group By Left

crsakawolf

Erfahrenes Mitglied
Hallo,

ich bin grad am Verzweifeln.

Ich muss meine Scripte von Mysql auf MSSql umschreiben.

Hierzu folgende Problematik
- ich möchte die sortim_nr komplett ausgegeben haben
- Sie jedoch auf die Ersten 5 Zeichen gruppieren
- also bei 12345xy und 12345ab soll nur 12345xy (der erste gefundene) ausgegeben werden
- klappt bei Mysql Super

Hier Mysql:

Code:
SELECT * FROM webshop_sortim WHERE webshop_sortim_lastdatetimestamp > '"&timestamp&"' AND (webshop_sortim_reportingnrid = '40' OR webshop_sortim_reportingnrid = '41' OR webshop_sortim_reportingnrid = '42') GROUP BY LEFT(webshop_sortim_nr,5)"

Hier der MSSQL:

Code:
SELECT webshop_sortim_nr FROM webshop_sortim  WHERE webshop_sortim_lastdatetimestamp > '1309824000' AND (webshop_sortim_reportingnrid = '40' OR webshop_sortim_reportingnrid = '41' OR webshop_sortim_reportingnrid = '42') GROUP BY left(webshop_sortim_nr,5)

Vielen dank schonmal.
Hab leider auch nix gefunden was mir wirklich helfen könnte
 
Leider nein, kommt folgende Fehlermeldung:

SELECT webshop_sortim_nr FROM webshop_sortim WHERE webshop_sortim_lastdatetimestamp > '1309824000' AND (webshop_sortim_reportingnrid = '40' OR webshop_sortim_reportingnrid = '41' OR webshop_sortim_reportingnrid = '42') GROUP BY substr(webshop_sortim_nr,1,5)

Microsoft OLE DB Provider for ODBC Drivers Fehler "80040e14'

[Microsoft][ODBC SQL Server Driver][SQL Server]'substr' wird nicht als Name einer integrierten Funktion erkannt.


BZW wenn ich Substring nehme

Code:
SELECT webshop_sortim_nr FROM webshop_sortim  WHERE webshop_sortim_lastdatetimestamp > '1309824000' AND (webshop_sortim_reportingnrid = '40' OR webshop_sortim_reportingnrid = '41' OR webshop_sortim_reportingnrid = '42') GROUP BY substring(webshop_sortim_nr,1,5)

kommt als fehlermeldung:

[Microsoft][ODBC SQL Server Driver][SQL Server]Die 'webshop_sortim.webshop_sortim_nr'-Spalte ist in der Auswahlliste ungültig, da sie nicht in einer Aggregatfunktion und nicht in der GROUP BY-Klausel enthalten ist


Das Problem ist immer, das wenn ich es gruppiere dann auch nur die Zeichen rausbekomme, die ich Gruppiere. Heist wenn ich nach den ersten 5 Zeichen Gruppieren will, bekomme ich auch nur die ersten 5 Zeichen zurück als Array :(

Das ärgerliche ist ja für mich, das mysql alles geht, ich es aber unbedingt auf MSSQL umbauen muss ....
 
Zuletzt bearbeitet:
MSSQL erlaubt es nicht, dass du spalten selectest die weder im group by aufgeführt, noch über eine aggregatsfunktion abgerufen werden.

Du hast leider kein DB Schema gepostet, so dass ich dir hier nur allgemein den rat geben kann. Versuch es mit nem subquery.

beispiel tabelle:

id, spalte1, spalte2, spalte3, spalte4
SQL:
SELECT t1.* FROM tabelle t1 INNER JOIN (
    SELECT max(id) as id FROM tabelle GROUP BY LEFT(spalte4, 5)
) tmp
ON t1.id = tmp.id


Alternativ kannst du, wenn dich wirklich nur die werte interessieren die bei dem LEFT raus kommen, das query auch so schreiben:

SQL:
SELECT LEFT(spalte4, 5) FROM tabelle GROUP BY LEFT(spalte4, 5)
oder sogar so:
SQL:
SELECT DISTINCT LEFT(spalte4, 5) FROM tabelle
 
Zuletzt bearbeitet:
Hallo, das wichtige bei dem DB Schema ist nur die nummer.

Diese kann wie folgt aussehen:

03001P 201001
03001E 201001
03001 201001

xxxxxP 201001
xxxxxE 201001
xxxxxZ 201001

an etwas anderem kann ich es nicht identifizieren 'Leider'

Ich teste jetzt mal deine SubQuerys.
 
Leider gibt es in SQL Server kein FIRST() oder ähnliches, so dass das ganze generell nur funktioniert, wenn man mit funktionen wie MIN oder MAX arbeiten kann (Numerische IDs, timestamps, ect.)

Das Problem was SQL Server damit hat ist, dass es nicht weiss, welchen der potentiell millionen groupierten datensätze du meinst, von dem es den wert nehmen soll.

MySQL nimmt hier einfach den ersten den es findet. Es gibt, ausser der (oben beschriebenen) möglichkeit über nummerische oder indirekt nummerische (timestamps) werte meines wissens keine möglichkeit dieses verhalten nachzubilden.
 

Neue Beiträge

Zurück