2009-06-29 20 views
7

que tienen un conjunto de datos en una tabla llamada BWHourlyReadings, por ejemplo:¿Cómo combino/fusiono columnas de dos resultados de consulta 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 

Para cada día hay hasta 24 lecturas por ServiceID.

Tengo tan lejos como dos separadosPIVOT consultas, uno para la columna de la InputOctets y uno para la columna de OutputOctets (sólo se muestra aquí por razones de brevedad):

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

Esto me da a mi InputOctets y OutputOctets en dos conjuntos de resultados por separado, por ejemplo:

El resultado PIVOT consulta en InputOctets:

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

El resultado PIVOT consulta en OutputOctets:

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

que necesito para producir un informe como este:

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 

¿Cómo puedo combinar los dos resultados de la consulta para producir el informe anterior?

Actualización:

He actualizado los datos en el formato de informe deseado para que coincida con los datos en el ejemplo de la tabla de origen. Mis disculpas por la confusión.

Respuesta

2

use union o union para fusionar los 2 resultados.

+0

que se me acaba de dar un resultado combinado, uno tras otro . Necesito unir dos conjuntos de columnas en el resultado. – Kev

3

no tengo ni idea de cómo calcular su HourX (in | out) de su (Entrada | Salida) octetos, pero después podría funcionar para usted

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 

Probado con los datos siguientes.

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

Las HourX (In | Out) provienen de la consulta PIVOT, por lo que recibo horas como los nombres de las columnas. Solo podemos producir un resultado por separado usando PIVOT para InputOctets y luego OutputOctets. – Kev

+0

@Kev, creo que me malentendió. La consulta debe producir las columnas que necesita. Simplemente no sabía cómo llegar desde [InputOctet] 383088 y [OutputOctet] 804249 a [Hour1In] 350230878. –

+0

Disculpas, he actualizado los datos y he retocado la pregunta un poco para poder aclararla. – Kev

-1

Esta respuesta viene de la escuela ágil/YAGNI de consultas SQL .....

¿El informe absolutamente tiene que estar en este formato? Una consulta más simple y más fácil de mantener podría devolver la información correcta, simplemente se presentaría de forma ligeramente diferente. La siguiente consulta devuelve los datos en un formato ligeramente diferente

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

Sí, los datos deben estar en formato de tabla cruzada. – Kev

0

Crear una variable @table y poner todas las columnas de esa tabla e insertar Ithe todos los valores de esa tabla y al final de selección de esa tabla. significa que si quiere 24 columnas, cree una tabla con 24 columnas e inserte una por una fila en este

1

y tiene dos consultas ... así que creo que podría usar esas dos consultas como "tablas" en una consulta de contenedor y únelas


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 

o use INNER JOIN si lo prefiere.esto es más o menos lo mismo que hacer dos vistas de sus consultas y luego unir esas vistas.

PS: no probado ... trabajaría con SQL recta, pero no tengo ninguna experiencia real con las tablas dinámicas y que podría ser el de colgar

+0

Esta solución funcionará, pero Lieven es más eficiente y legible. –

Cuestiones relacionadas