2016-07-13 12 views
0

Ich habe in diesem Sommer an einem Projekt für eine Firma gearbeitet, immer noch sehr umsonst, auch wenn ich gerade die Schule abschließe, laufe ich immer wieder Probleme mit der Gruppe durch und ordne Klauseln an.Group by/Order by problems MSSQL

Nichts, was ich versuche zu funktionieren scheint, here, was ich bisher (die Syntax ist suuuuper für Gruppe von/Auftrag vermasselt)

SELECT DISTINCT ACT.ROW_ID , ACT.CREATED , MEM.FIRST_NAME , MEM.LAST_NAME , LOC.NAME , COUNT(*) as "number" , CAT.NAME , SER.NAME , EMP.FIRST_NAME , EMP.LAST_NAME , SER.DURATION , ACT.CASH , COS.NAME , ACT.COMMENTS , ACT.TIP FROM 
S_ACTIVITY ACT, S_LOCATION LOC, S_CATEGORY CAT, S_EMPLOYEE EMP, S_SERVICE SER, S_COST_CODE COS, S_MEMBER MEM 
WHERE ACT.EMPLOYEE_ID = EMP.ROW_ID AND ACT.SERVICE_ID = SER.ROW_ID AND ACT.CATEGORY_ID = CAT.ROW_ID AND ACT.COST_CODE_ID = COS.ROW_ID AND 
ACT.LOCATION_ID = LOC.ROW_ID AND ACT.MEMBER_ID = MEM.ROW_ID 
GROUP BY LOC.NAME 
ORDER BY number 

Das ist mit der Zählung als andere Führer Online sagten i eine Art oder zählen für die Bestellung benötigt ... Heres das Original ...

SELECT DISTINCT ACT.ROW_ID , ACT.CREATED , MEM.FIRST_NAME , MEM.LAST_NAME , LOC.NAME , CAT.NAME , SER.NAME , EMP.FIRST_NAME , EMP.LAST_NAME , SER.DURATION , ACT.CASH , COS.NAME , ACT.COMMENTS , ACT.TIP FROM 
S_ACTIVITY ACT, S_LOCATION LOC, S_CATEGORY CAT, S_EMPLOYEE EMP, S_SERVICE SER, S_COST_CODE COS, S_MEMBER MEM 
WHERE ACT.EMPLOYEE_ID = EMP.ROW_ID AND ACT.SERVICE_ID = SER.ROW_ID AND ACT.CATEGORY_ID = CAT.ROW_ID AND ACT.COST_CODE_ID = COS.ROW_ID AND 
ACT.LOCATION_ID = LOC.ROW_ID AND ACT.MEMBER_ID = MEM.ROW_ID 
GROUP BY LOC.NAME 
ORDER BY LOC.NAME 

Danke für die Hilfe, sehr geschätzt! :)

+2

(1) Ich entfernte die externen Datenbank-Tags. Fühlen Sie sich frei, das Tag für die Datenbank, die Sie wirklich verwenden, hinzuzufügen. (2) Lerne, explizite, richtige "JOIN" -Syntax zu verwenden. Kommas in der FROM-Klausel sind schwer zu lesen. –

+0

Ich würde dringend empfehlen, dies zu lesen: [Visual Representation of SQL Joins] (http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins) –

+0

Es ist nichts offensichtlich falsch mit der 'GROUP BY'- und' ORDER BY'-Klauseln dieser Abfragen. – Uueerdo

Antwort

0

Explicit tritt - Verwenden Sie sie, sie sind groß. Hier ein Beispiel:

SELECT DISTINCT ACT.ROW_ID , ACT.CREATED , MEM.FIRST_NAME , MEM.LAST_NAME , LOC.NAME , CAT.NAME , SER.NAME , EMP.FIRST_NAME , EMP.LAST_NAME , SER.DURATION , ACT.CASH , COS.NAME , ACT.COMMENTS , ACT.TIP FROM 
S_ACTIVITY ACT, S_LOCATION LOC, S_CATEGORY CAT, S_EMPLOYEE EMP, S_SERVICE SER, S_COST_CODE COS, S_MEMBER MEM 
WHERE ACT.EMPLOYEE_ID = EMP.ROW_ID AND ACT.SERVICE_ID = SER.ROW_ID AND ACT.CATEGORY_ID = CAT.ROW_ID AND ACT.COST_CODE_ID = COS.ROW_ID AND 
ACT.LOCATION_ID = LOC.ROW_ID AND ACT.MEMBER_ID = MEM.ROW_ID 

Wird

SELECT DISTINCT ACT.ROW_ID, ACT.CREATED, MEM.FIRST_NAME, MEM.LAST_NAME, LOC.NAME, 
       CAT.NAME, SER.NAME, EMP.FIRST_NAME, EMP.LAST_NAME, SER.DURATION, 
       ACT.CASH, COS.NAME, ACT.COMMENTS, ACT.TIP 
FROM  S_ACTIVITY ACT 
INNER JOIN S_LOCATION LOC ON ACT.LOCATION_ID = LOC.ROW_ID 
INNER JOIN S_CATEGORY CAT ON ACT.CATEGORY_ID = CAT.ROW_ID 
INNER JOIN S_EMPLOYEE EMP ON ACT.EMPLOYEE_ID = EMP.ROW_ID 
INNER JOIN S_SERVICE SER ON ACT.SERVICE_ID = SER.ROW_ID 
INNER JOIN S_COST_CODE COS ON ACT.COST_CODE_ID = COS.ROW_ID 
INNER JOIN S_MEMBER MEM ON ACT.MEMBER_ID = MEM.ROW_ID 

Distinct - Distinct ist ein SELECT Modifikator. Es beschränkt die Ergebnisse auf bestimmte Zeilen und entspricht der Verwendung von GROUP BY all_columns_here. Wenn das Ihr Ziel ist, dann entfernen Sie Ihre GROUP BY vollständig und Sie sind gut zu gehen (siehe obige Abfrage). Was zu einem letzten Punkt führt ...

Gruppierung/Sortierung nach - Sie können entweder ein GROUP BY oder ORDER BY, oder beides. Diese erfordern einander nicht. Außerdem wird GROUP BY nur von SQL benötigt, wenn Sie ein Aggregat haben, und ORDER BY wird nur für bestimmte Funktionen benötigt. Andernfalls können Sie sie nach Belieben verwenden, um Ihre Projektanforderungen zu erfüllen.

+0

Vielen Dank für Ihre Hilfe, immer noch ein wenig zu optimieren, was zu bestellen, aber ich denke, ich habe ein wenig von der Logik, danke für alle Kommentare! – Rolthar

0

Hier ist etwas, um Sie zu beginnen, da Sie SO neu sind. Willkommen, BTW.

Ich würde wirklich Gordon und Maciej Kommentare lesen, und die Folgen auf Artikel über JOINS. Viel Glück mit Ihrem Studium.

Dies ist nur syntaktisch korrekt für MSSQL, mit einigen Annahmen über Ihre JOINs. Es ist nicht unbedingt die Ergebnisse, die Sie suchen.

SELECT DISTINCT 
    ACT.ROW_ID, 
    ACT.CREATED, 
    MEM.FIRST_NAME, 
    MEM.LAST_NAME, 
    LOC.NAME, 
    COUNT(*) as "number", 
    CAT.NAME, 
    SER.NAME, 
    EMP.FIRST_NAME, 
    EMP.LAST_NAME, 
    SER.DURATION, 
    ACT.CASH, 
    COS.NAME, 
    ACT.COMMENTS, 
    ACT.TIP 
FROM 
    S_ACTIVITY ACT 
    INNER JOIN S_LOCATION LOC on ACT.LOCATION_ID = LOC.ROW_ID 
    INNER JOIN LOC. S_CATEGORY CAT ON ACT.CATEGORY_ID = CAT.ROW_ID 
    INNER JOIN S_EMPLOYEE EMP ON ACT.EMPLOYEE_ID = EMP.ROW_ID 
    INNER JOIN S_SERVICE SER ON ACT.SERVICE_ID = SER.ROW_ID 
    INNER JOIN S_COST_CODE COS ON ACT.COST_CODE_ID = COS.ROW_ID 
    INNER JOIN S_MEMBER MEM ON ACT.MEMBER_ID = MEM.ROW_ID 
GROUP BY 
    --every column that isn't an aggreggate... i.e. everything except COUNT(*). 
    ACT.ROW_ID, 
    ACT.CREATED, 
    MEM.FIRST_NAME, 
    MEM.LAST_NAME, 
    LOC.NAME, 
    CAT.NAME, 
    SER.NAME, 
    EMP.FIRST_NAME, 
    EMP.LAST_NAME, 
    SER.DURATION, 
    ACT.CASH, 
    COS.NAME, 
    ACT.COMMENTS, 
    ACT.TIP 
ORDER BY 
    --You can't use alias names in GROUP BY or ORDER BY clauses. 
    COUNT(*)