2009-06-08 4 views
6

J'ai une table qui contient des informations pour 4 générateurs électriques, je voudrais avoir les résultats des quatre querys dans une rangée. Quelqu'un a-t-il une suggestion. MerciComment puis-je prendre les résultats de sélections multiples et combiner en une seule ligne

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

S'il vous plaît utiliser le 'SQLServer' étiquette plutôt que «MSSQL. Regardez les suggestions lorsque vous étiquetez vos questions: toute étiquette avec un nombre inférieur à 10 après son nom est probablement faux. Dans ce cas, il y a plus de 5000 questions marquées 'sqlserver' et ZERO étiquetées 'msssql'. –

+0

Je ne sais pas pourquoi j'ai eu un vote négatif – Brad

+0

Pour l'enregistrement: n'était pas moi. –

Répondre

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 

, ou SQL Server 2005+, ceci:

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

Mes pensées entièrement - bien que personnellement je alias ces colonnes aussi. – RichardOD

+0

Eh bien, c'est bien aussi :-) J'étais un peu en retard pour poster mon approche variable. –

1

Comme le nombre de selects est limité à quatre, une solution serait de choisir dans variables, puis faites une sélection finale. Comme les éléments suivants:

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

vous pourriez mieux aller avec la solution de sous-requête ci-dessus. Vous pouvez utiliser mon approche au cas où vous auriez besoin de manipuler les quatre valeurs avant de les sélectionner. –

2

Une autre 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

Cela fonctionnera en effet pour AVG (et seulement pour AVG), car AVG ne dépend pas du nombre de fois que la table est jointe à une autre table. Les performances seront bien sûr médiocres, mais une solution qui fonctionne et qui n'est pas si évidente mérite un +1. – Quassnoi