2009-06-08 14 views
6

4 elektrik jeneratörüne ilişkin bilgileri içeren bir tablonun bir satırda dört sorgudan elde edilmesini istiyorum. herhangi birinin bir öneri var. TeşekkürÇoklu seçimlerin sonuçlarını nasıl alabilirim ve bir satırda birleştiririm

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

ziyade 'mssql' yerine 'Sqlserver' etiketini kullanın aşağıdaki gibi. Sorularınızı etiketlerken önerileri izleyin: adının büyük olasılıkla yanlış olması durumunda 10'dan küçük bir numaraya sahip herhangi bir etiket. Bu durumda, 'sqlserver' ve ZERO 'msssql' etiketli 5000'den fazla soru var. –

+0

Neden bir aşağı oy aldım emin değilim – Brad

+0

Kayıt için: ben değildim. –

cevap

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 

veya SQL Server 2005+ yılında bu: seçer sayısı arttıkça

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

Düşüncelerim tamamen, ancak bu sütunları kişisel olarak taklit edebilmem de. – RichardOD

+0

Eh, bu da çok iyi :-) Değişken yaklaşımımı biraz geciktiriyordum. –

1

dört sınırlıdır, tek çözüm haline seçmek olacaktır değişkenler ve daha sonra nihai seçim yapın.

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

Yukarıdaki alt sorgulama çözümüyle daha iyi gidebilirsin. Tercihimi seçmeden önce dört değeri kullanmanız gerektiğinde kullanmak isteyebilirsiniz. –

2

başka seçenek:

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

AVG, tablonun kaç kez başka bir tabloya çapraz bağlandığına bağlı olmadığından, bu gerçekten AVG (ve sadece AVG için) için çalışacaktır. Performans elbette fakir olacak, ama bir çalışma ve bu kadar bariz olmayan bir çözüm + 1'i hak ediyor. – Quassnoi

İlgili konular