如何组合/合并两个SQL查询结果中的列?

时间:2009-06-29 11:25:17

标签: sql sql-server sql-server-2005 tsql

我在名为BWHourlyReadings的表中有一组数据,例如:

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

每天ServiceID最多有24个读数。

我已经有了两个单独的 PIVOT个查询,一个用于InputOctets列,另一个用于OutputOctets列(此处只显示一个)为简洁起见:

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

这会在两个单独的结果集中为我提供InputOctetsOutputOctets,例如:

PIVOT上的InputOctets查询结果:

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

PIVOT上的OutputOctets查询结果:

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

我需要制作一份这样的报告:

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

如何合并两个查询结果以生成上述报告?

更新

我已更新所需报告格式的数据,以匹配源表示例中的数据。我为这种困惑道歉。

5 个答案:

答案 0 :(得分:3)

我不知道你如何从你的(输入|输出)八位字节计算你的HourX(输入|输出)但以下可能适用于你

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

使用以下数据进行测试。

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 :(得分:2)

使用union或union all合并2个结果。

答案 2 :(得分:1)

你有两个查询...所以我认为你可以在包装器查询中将这两个查询用作“表”并加入它们


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 

如果您愿意,可以使用INNER JOIN。这与从查询中创建两个视图,然后加入这些视图几乎相同。

PS:Not TESTED ...可以使用直接SQL,但我没有透视表的真实经验,可能是挂断

答案 3 :(得分:0)

创建一个@table变量并将所有列放在该表中,并将其插入该表中的所有值,最后从该表中选择。 表示如果您想要24列,则创建具有24列的表并在此

中逐行插入

答案 4 :(得分:-1)

这个答案来自Agile / YAGNI的SQL查询学校......

报告绝对必须采用这种格式吗?一个更简单,更易于维护的查询可以返回正确的信息,它只会略有不同。以下查询以稍微不同的格式返回数据?

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