2009-06-29 4 views
7

Mam zestaw danych w tabeli o nazwie BWHourlyReadings, na przykład:Jak połączyć/scalić kolumny z dwóch wyników zapytania SQL?

ServiceID  Hour InputOctets OutputOctets 
=========  ==== =========== ================= 
27222   1  383088   804249 
27222   2  270529   688683 
27222   3  247251   290124 
... up to 24 hours of data 
27222   24  236053   239165 

28900   1  883011   914249 
28900   3  444251   891124 
... up to 24 hours of data 
28900   24  123053   452165 

Dla każdego dnia są do 24 odczytów na ServiceID.

Mam miarę dwa oddzielnePIVOT zapytania, po jednym dla kolumny InputOctets i jeden dla kolumny OutputOctets (tylko jeden pokazano tu na zwięzłość):

-- Replace HourXIn with HourXOut for OutputOctets 
SELECT ServiceID, [1] AS 'Hour1In', [2] AS 'Hour2In', [3] AS 'Hour3In', ... 
FROM 
(
    SELECT 
     ServiceID, 
     Hour, 
     TotalInputOctets -- Other query has OutputOctets here instead 
    FROM 
     BWHourlyReadings 

) AS bw 
PIVOT 
( 
    MAX(TotalInputOctets) -- Other query has OutputOctets here instead 
    FOR [Hour] IN ([1], [2], [3], ... [24]) 
) AS pvt 

Daje mi InputOctets i OutputOctets w dwa niezależne zestawy wyników, na przykład:

wynik PIVOT zapytanie o InputOctets:

ServiceID Hour1In Hour2In Hour3In . Hour24In  
========= ======= ======= ======= ========  
27222  383088 270529 247251 236053 
28900  883011 0  444251 123053 

Wynik PIVOT zapytanie na OutputOctets:

ServiceID Hour1Out Hour2Out Hour3Out .. Hour24Out  
========= ======== ======== ======== ======== 
27222  804249 688683 290124  239165 
28900  914249 0  891124  452165 

muszę przedstawić sprawozdanie takiego:

ServiceID Hour1In Hour1Out Hour2In Hour2Out Hour3In Hour3Out .. Hour24In Hour24Out  
========= ======= ======== ======= ======== ======= ======== ======= ======== 
27222  383088 804249 270529 688683 247251 290124  236053 239165 
28900  883011 914249 0  0  444251 891124  123053 452165 

Jak scalić dwa wyników zapytania w celu uzyskania raportu powyżej?

Aktualizacja:

mam zaktualizowane dane w żądanym formacie raportu, aby dopasować dane w przykładzie tabeli źródłowej. Moje przeprosiny za zamieszanie.

Odpowiedz

2

użyć union lub union all, aby połączyć 2 wyniki.

+0

To będzie po prostu dać mi łączny wynik, jeden po drugim . Muszę scalić dwa zbiory kolumn w wyniku. – Kev

3

nie mam pojęcia, jak można obliczyć swój HourX (In | Out) od Wejścia (Output) oktetach ale następujące może pracować dla Ciebie

SELECT 
    ServiceID 
    , [Hour1In] = SUM(CASE WHEN Hour = 1 THEN InputOctets ELSE 0 END) 
    , [Hour1Out] = SUM(CASE WHEN Hour = 1 THEN OutputOctets ELSE 0 END) 
    , [Hour2In] = SUM(CASE WHEN Hour = 2 THEN InputOctets ELSE 0 END) 
    , [Hour2Out] = SUM(CASE WHEN Hour = 2 THEN OutputOctets ELSE 0 END) 
    , [Hour3In] = SUM(CASE WHEN Hour = 3 THEN InputOctets ELSE 0 END) 
    , [Hour3Out] = SUM(CASE WHEN Hour = 3 THEN OutputOctets ELSE 0 END) 
    -- , ... 
    , [Hour24In] = SUM(CASE WHEN Hour = 24 THEN InputOctets ELSE 0 END) 
    , [Hour24Out] = SUM(CASE WHEN Hour = 24 THEN OutputOctets ELSE 0 END) 
FROM 
    @BWHourlyReadings 
GROUP BY 
    ServiceID 

przetestowany z następującymi danymi.

DECLARE @BWHourlyReadings TABLE (ServiceID INT, Hour INT, InputOctets INTEGER, OutputOctets INTEGER) 

INSERT INTO @BWHourlyReadings VALUES (27222, 1, 383088, 804249) 
INSERT INTO @BWHourlyReadings VALUES (27222, 2, 270529, 688683) 
INSERT INTO @BWHourlyReadings VALUES (27222, 3, 247251, 290124) 
INSERT INTO @BWHourlyReadings VALUES (27222, 24, 236053, 239165) 
+1

HourX (In | Out) pochodzą z zapytania PIVOT, więc otrzymuję godziny jako nazwy kolumn. Możemy wytworzyć tylko oddzielny wynik używając PIVOT dla InputOctets, a następnie OutputOctets. – Kev

+0

@Kev, myślę, że źle mnie zrozumiałeś. Zapytanie powinno wygenerować kolumny, których potrzebujesz. Po prostu nie wiedziałem, jak można uzyskać od [InputOctet] 383088 i [OutputOctet] 804249 do [Hour1In] 350230878. –

+0

Przepraszam Lieven, zaktualizowałem dane i nieco zmieniłem to pytanie, aby, mam nadzieję, uczynić je bardziej przejrzystym. – Kev

-1

Ta odpowiedź przychodzi ze szkoły Agile/YAGNI zapytań SQL .....

Czy raport bezwzględnie muszą być w tym formacie? Prostsze, łatwiejsze w utrzymaniu zapytanie może zwrócić poprawne informacje, po prostu będzie prezentowane nieco inaczej. Poniższe zapytanie zwraca dane w nieco innym formacie?

SELECT serviceid, hour, SUM(InputOctets) AS InputOctets, SUM(OutputOctets) AS OutputOctets 
FROM BWHourlyReadings 
GROUP BY serviceid, hour 
ORDER BY serviceid, hour 
+0

Tak, dane muszą być w formacie przestawnym. – Kev

0

Tworzenie jednej zmiennej @table i umieścić wszystkie kolumny w tej tabeli i wstawić ithe wszystkie wartości w tej tabeli i wreszcie wybierz z tej tabeli. oznacza, jeśli chcesz 24 kolumny, a następnie utworzyć tabelę z 24 kolumnami i wstawić jeden po drugim wiersz w tym

1

dobrze masz dwa pytania ... więc myślę, że możesz po prostu użyć tych dwóch zapytań jako "tabele" w Zapytanie opakowujące i dołącz do nich


select * from 
(*insert your big-ass OutputOctets query SQL here*) oo, 
(*insert your big-ass InputOctets query SQL here*) io 
where oo.ServiceID = oi.ServiceID 

lub użyj INNER JOIN, jeśli wolisz.jest to prawie to samo, co tworzenie dwóch widoków z zapytań, a następnie dołączanie do tych widoków.

PS: NIE TESTOWANY ... będzie działać z prostej SQL, ale nie mam prawdziwe doświadczenie z tabel przestawnych i że może być hang-up

+0

To rozwiązanie działa, ale Lieven jest bardziej wydajny i czytelny. –