2009-06-08 6 views
6

Ich habe eine Tabelle, die Informationen für 4 elektrische Generatoren enthält Ich möchte die Ergebnisse der vier Abfragen in einer Zeile haben. Hat jemand einen Vorschlag? DankWie nehme ich die Ergebnisse von mehreren Auswahlen und zu einer Zeile kombinieren

SELECT avg(KW) as GEN_101_AVG 
FROM   genset WHERE  (GenSetName like 'GEA3519') and GenDate >= '1 jan 2003 00:00:00' and GenDate < '1 feb 2003 00:00:00' 

    SELECT avg(KW) as GEN_201_AVG 
FROM   genset WHERE  (GenSetName like 'GEA3520') and GenDate >= '1 jan 2003 00:00:00' and GenDate < '1 feb 2003 00:00:00' 

SELECT avg(KW) as GEN_301_AVG 
FROM   genset WHERE  (GenSetName like 'GEA3521') and GenDate >= '1 jan 2003 00:00:00' and GenDate < '1 feb 2003 00:00:00' 

SELECT avg(KW) as GEN_401_AVG 
FROM   genset WHERE  (GenSetName like 'GEA3522') and GenDate >= '1 jan 2003 00:00:00' and GenDate < '1 feb 2003 00:00:00' 

MS-SQL

+1

Bitte benutzen Sie den 'sqlserver' -Tag statt 'MSSQL'. Beobachten Sie die Vorschläge, wenn Sie Ihre Fragen markieren: Ein Tag mit einer Nummer kleiner als 10, nachdem sein Name falsch ist. In diesem Fall gibt es über 5000 Fragen, die mit "sqlserver" und ZERO mit "msssql" gekennzeichnet sind. –

+0

Ich bin mir nicht sicher, warum ich eine Stimme bekommen habe – Brad

+0

Für den Rekord: war ich nicht. –

Antwort

20
SELECT (
     SELECT avg(KW) 
     FROM genset 
     WHERE (GenSetName like 'GEA3519') 
       and GenDate >= '1 jan 2003 00:00:00' 
       and GenDate < '1 feb 2003 00:00:00' 
     ) AS avg_GEA3519, 
     (
     SELECT avg(KW) 
     FROM genset 
     WHERE (GenSetName like 'GEA3520') 
       and GenDate >= '1 jan 2003 00:00:00' 
       and GenDate < '1 feb 2003 00:00:00' 
     ) AS avg_GEA3520, 
     (
     SELECT avg(KW) 
     FROM genset 
     WHERE (GenSetName like 'GEA3521') 
       and GenDate >= '1 jan 2003 00:00:00' 
       and GenDate < '1 feb 2003 00:00:00' 
     ) AS avg_GEA3521, 
     (
     SELECT avg(KW) 
     FROM genset 
     WHERE (GenSetName like 'GEA3522') 
       and GenDate >= '1 jan 2003 00:00:00' 
       and GenDate < '1 feb 2003 00:00:00' 
     ) AS avg_GEA3522 

oder in SQL Server 2005+, das:

SELECT [GEA3519], [GEA3520], [GEA3521], [GEA3522] 
FROM (
     SELECT GenSetName, KW 
     FROM genset 
     WHERE GenDate >= '1 Jan 2003 00:00:00' 
       AND GenDate < '1 Feb 2003 00:00:00' 
     ) AS q 
PIVOT 
(
     AVG(KW) 
     FOR GenSetName IN (['GEA3519'], ['GEA3520'], ['GEA3521'], ['GEA3522'] 
) 
+1

Meine Gedanken vollständig - obwohl ich auch diese Spalten persönlich aliasieren würde. – RichardOD

+0

Nun, das ist auch gut :-) Ich war ein wenig zu spät, meinen variablen Ansatz posten. –

1

Da die Anzahl von Auswahl auf vier beschränkt ist, würde eine Lösung zu wählen sein, in Variablen und dann eine endgültige Auswahl. Wie folgt aus:

declare @var1 <TYPE> 
declare @var2 <TYPE> 
declare @var3 <TYPE> 
declare @var4 <TYPE> 

select @var1 = SELECT avg(...) ... 
select @var2 = ... 
select @var3 = ... 
select @var4 = ... 

select @var1 as ..., @var2 as ..., @var3 as ..., @var4 as ... 
+0

können Sie besser mit der obigen Unterabfrage Lösung gehen. Sie können meinen Ansatz verwenden, falls Sie vor der Auswahl die vier Werte ändern müssen. –

2

eine weitere Option:

SELECT 
    AVG(GEN_101.kw) AS GEN_101_AVG, 
    AVG(GEN_201.kw) AS GEN_201_AVG, 
    AVG(GEN_301.kw) AS GEN_301_AVG, 
    AVG(GEN_401.kw) AS GEN_401_AVG 
FROM 
    Genset GEN_101 
INNER JOIN Genset GEN_201 ON 
    GEN_201.GenSetName = 'GEA3520' AND 
    GEN_201.GenDate >= '1 jan 2003 00:00:00' AND 
    GEN_201.GenDate < '1 feb 2003 00:00:00' 
INNER JOIN Genset GEN_101 ON 
    GEN_301.GenSetName = 'GEA3521' AND 
    GEN_301.GenDate >= '1 jan 2003 00:00:00' AND 
    GEN_301.GenDate < '1 feb 2003 00:00:00' 
INNER JOIN Genset GEN_101 ON 
    GEN_401.GenSetName = 'GEA3522' AND 
    GEN_401.GenDate >= '1 jan 2003 00:00:00' AND 
    GEN_401.GenDate < '1 feb 2003 00:00:00' 
WHERE 
    GEN_101.GenSetName = 'GEA3519' AND 
    GEN_101.GenDate >= '1 jan 2003 00:00:00' AND 
    GEN_101.GenDate < '1 feb 2003 00:00:00' 
+0

Dies funktioniert in der Tat für AVG (und nur für AVG), da AVG nicht davon abhängt, wie oft die Tabelle mit einer anderen Tabelle kreuzweise verbunden wird. Leistung wird natürlich schlecht sein, aber eine funktionierende und nicht so offensichtliche Lösung verdient ein +1. – Quassnoi

Verwandte Themen