2009-06-08 4 views
6

4 개의 전기 생성기에 대한 정보를 포함하는 테이블이 있습니다. 한 행에 4 개의 쿼리 결과가 필요합니다. 누구든지 제안을 하나합니까? 감사다중 선택 결과를 하나의 행으로 결합하는 방법

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

오히려 'MSSQL'보다 'SQLSERVER'태그를 사용하세요 다음과 같은. 질문에 태그를 지정할 때 제안 사항을보십시오. 이름이 10보다 작은 태그는 이름이 잘못되었을 수 있습니다. 이 경우 'sqlserver'라는 태그가 붙은 5000 개 이상의 질문과 'msssql'이라는 태그가 지정된 ZERO가 있습니다. –

+0

내가 왜 투표를했는지 확실하지 않다 – Brad

+0

기록을 위해 : 나 아니 었어. –

답변

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 

또는 SQL Server 2005+, 본 : 선택의 수가

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

내 생각은 전적으로 개인별로 별칭을 지정할 수도 있지만. – RichardOD

+0

글쎄, 그건 너무 좋은거야 :-) 나는 내 변수 접근 방식을 게시하는 조금 늦었다. –

1

가 4 개로 제한 한 용액으로 선택하는 것 변수를 선택하고 최종 선택을하십시오.

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

위의 하위 쿼리 솔루션을 사용하는 것이 좋습니다. 선택하기 전에 네 개의 값을 조작해야 할 경우에 대비하여 내 방식을 사용할 수 있습니다. –

2

또 다른 옵션 :

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는 테이블이 다른 테이블과 교차 결합되는 횟수에 의존하지 않기 때문에 실제로 AVG (및 AVG에만 해당)에서 작동합니다. 성능은 당연히 좋지 않을 것이지만 작동하지 않는 명백한 솔루션은 +1 할 가치가 있습니다. – Quassnoi

관련 문제