2009-06-08 32 views
6

Tôi có một bảng chứa thông tin cho 4 máy phát điện Tôi muốn có kết quả của bốn truy vấn trong một hàng. Còn ai có đề nghị nào không. Cảm ơnLàm cách nào để lấy kết quả của nhiều lựa chọn và kết hợp thành một hàng

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

Vui lòng sử dụng các từ khóa 'SQLServer' chứ không phải 'MSSQL'. Xem các đề xuất khi gắn thẻ câu hỏi của bạn: bất kỳ thẻ nào có số ít hơn 10 sau khi tên của nó có thể là sai. Trong trường hợp này, có hơn 5000 câu hỏi được gắn thẻ 'sqlserver' và ZERO được gắn thẻ 'msssql'. –

+0

Không chắc chắn tại sao tôi bị bỏ phiếu xuống – Brad

+0

Đối với hồ sơ: không phải tôi. –

Trả lời

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 

, hoặc trong SQL Server 2005+, đây:

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

Suy nghĩ của tôi hoàn toàn- mặc dù tôi sẽ đích thân bí danh các cột đó. – RichardOD

+0

Vâng, đó là tốt quá :-) Tôi đã được một chút muộn gửi cách tiếp cận biến của tôi. –

1

Khi số lượng Selects được giới hạn đến bốn, một giải pháp sẽ được chọn vào biến và sau đó thực hiện lựa chọn cuối cùng. Như sau:

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

bạn có thể tốt hơn với giải pháp truy vấn con trên. Bạn có thể sử dụng cách tiếp cận của tôi trong trường hợp bạn cần thao tác bốn giá trị trước khi chọn. –

2

Một lựa chọn khác:

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

Điều này thực sự sẽ làm việc cho AVG (và chỉ dành cho AVG), vì AVG không phụ thuộc vào số lần bảng được kết nối chéo với một bảng khác. Tất nhiên, hiệu năng sẽ kém, nhưng một giải pháp làm việc và không rõ ràng xứng đáng là +1. – Quassnoi

Các vấn đề liên quan