2009-06-29 10 views
7

J'ai un ensemble de données dans une table nommée BWHourlyReadings, par exemple:Comment combiner/fusionner des colonnes à partir de deux résultats de requête 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 

Pour chaque jour, il y a jusqu'à 24 lectures par ServiceID.

J'ai aussi loin que deux séparésPIVOT requêtes, une pour la colonne InputOctets et une pour la colonne OutputOctets (une seule est représentée ici par souci de concision):

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

Cela me donne mon InputOctets et OutputOctets en deux ensembles de résultats séparés, par exemple:

Le résultat de la requête sur PIVOTInputOctets:

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

Le résultat de la requête PIVOT sur OutputOctets:

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

Je dois produire un rapport comme celui-ci:

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 

Comment puis-je fusionner les deux résultats de la requête pour produire le rapport ci-dessus?

Mise à jour:

J'ai mis à jour les données dans le format de rapport souhaité pour faire correspondre les données dans l'exemple de la table source. Mes excuses pour la confusion.

Répondre

2

utilisez union ou union all pour fusionner les 2 résultats.

+0

Cela va me donner un résultat combiné, l'un après l'autre . Je dois fusionner deux ensembles de colonnes à travers le résultat. – Kev

3

Je ne sais pas comment vous calculez votre HourX (In | Out) de votre (entrée | sortie) mais qui suit pourrait octets travailler pour vous

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 

Testé avec les données suivantes.

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

Les HourX (In | Out) proviennent de la requête PIVOT de sorte que je reçois des heures comme noms de colonne. Nous pouvons seulement produire un résultat séparé en utilisant PIVOT pour les InputOctets, puis les OutputOctets. – Kev

+0

@Kev, je pense que vous m'avez mal compris. La requête devrait produire les colonnes dont vous avez besoin. Je ne savais pas comment vous obtenez de [InputOctet] 383088 & [OutputOctet] 804249 à [Hour1In] 350230878. –

+0

Excuses Lieven, j'ai mis à jour les données et re-jigged la question un peu pour le rendre plus clair. – Kev

-1

Cette réponse vient de l'école Agile/YAGNI des requêtes SQL .....

Le rapport doit absolument être dans ce format? Une requête plus simple et plus maintenable pourrait renvoyer l'information correcte, elle serait simplement présentée différemment. La requête suivante renvoie les données dans un format légèrement différent?

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

Oui, les données doivent être au format tableau croisé. – Kev

0

Créer une variable @table et de mettre toutes les colonnes dans ce tableau et insérez ithe toutes les valeurs dans ce tableau et enfin sélectionnez de cette table. signifie que si vous voulez 24 colonne puis créer une table avec 24 colonnes et insérer un par un dans ce

1

bien vous avez deux requêtes ... donc je pense que vous pourriez simplement utiliser ces deux requêtes comme les "tables" dans une requête wrapper et les joindre


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 

ou utiliser INNER JOIN si vous préférez.C'est à peu près la même chose que de faire deux vues sur vos requêtes, puis de rejoindre ces vues.

PS: PAS TESTE ... travaillerait avec SQL droite, mais je n'ai pas l'expérience réelle avec des tableaux croisés dynamiques et qui pourrait être le raccrochage

+0

Cette solution fonctionnera mais Lieven est plus performant et plus lisible. –

Questions connexes