2017-11-02 2 views
0

Ich habe diesen Kampf (Bit Noob mit SQL), um zusätzliche Spalte in SQL-Abfrage hinzuzufügen, die gleiche Informationen wie andere Spalte enthält, aber mehr gefiltert. Ich werde ein Beispiel geben und ein wenig erklären:Hinzufügen von zusätzlichen Spalte in SQL-Abfrage, die gleiche Informationen wie zuvor enthält, aber mehr gefiltert

SELECT 
    aMain.MaintGroupName, 
    CCALARMS = (SELECT COUNT(ALARMIDKEY) --subquery begins 
       FROM REPORTER.REPORTER_STATUS 
       WHERE 
        (MAINTMODECRONTAB != 'Y' 
        AND SUPPRESSESCL < 4 
        AND SPMAUTO != 1 
        AND ORIGINALSEVERITY > 0) 
        AND ((AIWAVER = 3 AND EVENTACTOR = 1) 
          OR 
          ((AIWAVER < 3 OR AIWAVER IS NULL) 
          AND ((CONTROLCENTREVIEW = 1 
           AND ORIGINALSEVERITY = 5) 
           OR (CONTROLCENTREVIEW = 2) 
           OR (ALERTGROUP = 'CHECKLIST') 
           ) 
         ) 
         ) 
       ), --subquery ends 
    COUNT(rSTA.ALARMIDKEY) -- same column as previous, but with no conditions 
FROM 
    REPORTER.reporter.REPORTER_STATUS rSTA 
INNER JOIN 
    AIWA2.dbo.MaintGroup aMain ON aMain.MaintGroupId = rSTA.ALARMOWNERID 
GROUP BY 
    aMain.MaintGroupName 

Das mag ich mir Gruppennamen bekommen, Alarme mit speziellem Zustand, gleichen Alarmen ohne jede Bedingung und Gruppe alles von Gruppennamen (zeigen mir spezifische Alarme und alle Alarme für jede Gruppe). Diese Abfrage zeigt mir einen Gruppennamen & alle Alarme korrekt gruppiert, aber diese "CCALARMS" werden nur für jede Gruppe gezählt, nicht nach gruppiert. Welche Bedingung sollte ich hinzufügen, damit diese Anzahl in einer Unterabfrage in einer Abfrage gruppiert wird? Vielleicht wird etwas wie rSTA.ALARMIDKEY = CCALARM.ALARMIDKEY in zusätzlichen Join benötigt?

Hier ist, was ich jetzt bekomme, wie Sie für jede Gruppe sehen können CCALARMS gezählt werden. Ich frage mich, wie ich es verteilen sollte. ALARM

Ich hoffe, es war klar, was ich erreichen möchte, wenn nicht, lass es mich wissen, ich werde mehr Details geben. Danke im Voraus!

+0

getestet Wir verwenden Microsoft SQL Server. – Robbac

Antwort

0

Bedingte Aggregation:

SELECT 
    aMain.MaintGroupName, 
    CCALARMS = COUNT(
       CASE WHEN      
        (MAINTMODECRONTAB != 'Y' 
        AND SUPPRESSESCL < 4 
        AND SPMAUTO != 1 
        AND ORIGINALSEVERITY > 0) 
        AND ((AIWAVER = 3 AND EVENTACTOR = 1) 
          OR 
          ((AIWAVER < 3 OR AIWAVER IS NULL) 
          AND ((CONTROLCENTREVIEW = 1 
           AND ORIGINALSEVERITY = 5) 
           OR (CONTROLCENTREVIEW = 2) 
           OR (ALERTGROUP = 'CHECKLIST') 
           ) 
         ) 
         ) 
       THEN rSTA.ALARMIDKEY END), 
    COUNT(rSTA.ALARMIDKEY) -- same column as previous, but with no conditions 
FROM 
    REPORTER.reporter.REPORTER_STATUS rSTA 
INNER JOIN 
    AIWA2.dbo.MaintGroup aMain ON aMain.MaintGroupId = rSTA.ALARMOWNERID 
GROUP BY 
    aMain.MaintGroupName 

Bitte Klammer überprüfen, nicht

+0

Hmm gut, obwohl es +10 Minuten dauert, scheint es eine Art Ausgabe zu liefern, wahrscheinlich die richtige. Haben Sie eine Idee, wie Sie Abfragen optimieren können, um schneller zu laufen? Ich frage mich, ob es aufgrund der Bedingungen oder vieler Daten etwas dauern kann. – Robbac

+0

Ausdrücke in der SELECT-Liste (sofern sie keine Unterabfragen enthalten) wie diese haben nur sehr geringe Auswirkungen auf einen Ausführungsplan. Sagt Sql server Studio, einen Index zu erstellen/ändern? – Serg

+0

Nein, leider keine Vorschläge von Ihnen .. – Robbac

Verwandte Themen