如何将两个 SQL 查询结果的列合并?

7

我有一组名为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,例如:
InputOctets上进行PIVOT查询的结果:
ServiceID Hour1In Hour2In Hour3In . Hour24In     
========= ======= ======= =======   ========    
27222     383088  270529  247251    236053   
28900     883011  0       444251    123053   

OutputOctetsPIVOT查询结果:

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个回答

3
我不知道你是如何从输入/输出八位组(Input/OutputOctets)计算出 HourX(In|Out),但以下方法可能对你有用。
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
HourX(In|Out) 是从 PIVOT 查询中获取的,因此我可以将小时作为列名。我们只能使用 PIVOT 分别生成 InputOctets 和 OutputOctets 的单独结果。 - Kev
@Kev,我觉得你误解了我的意思。查询应该生成你需要的列。我只是不知道你是如何从[InputOctet] 383088和[OutputOctet] 804249到[Hour1In] 350230878的。 - Lieven Keersmaekers
抱歉Lieven,我已经更新了数据并重新调整了问题,希望能更清晰明了。 - Kev
@Kev,在这种情况下,你尝试查询了吗?你可能会有惊喜(除非我误解了)。 - Lieven Keersmaekers
啊...你改变了查询...我对原来的查询感到困惑...我会尝试一下。干杯。 - Kev

2
使用 UNION 或 UNION ALL 来合并这两个结果。

这只会给我一个合并的结果,一个接一个的。我需要将两列数据集在结果中合并在一起。 - Kev

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。这与将查询制作为两个视图,然后连接这些视图几乎相同。

附注:未经测试...直接使用SQL应该可以工作,但我对数据透视表没有真正的经验,这可能会成为障碍。


这个解决方案可以工作,但Lieven的更高效和易读。 - an phu

0
创建一个@table变量,将所有列放入该表中,并将所有值插入该表中,最后从该表中选择。 如果您需要24个列,则创建具有24个列的表,并逐行插入。

-1

这个答案来自于敏捷/ YAGNI SQL查询的学派......

报告一定要以这种格式呈现吗?一个更简单、更易维护的查询可以返回正确的信息,只是呈现方式略有不同。以下查询以稍微不同的格式返回数据:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接