2009-06-29 76 views
7

我有一组数据,在名为BWHourlyReadings表,例如:如何组合/合并来自两个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 

对于每天有高达24个ServiceID读数。

我得尽可能两个独立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 

这给了我,我的InputOctets并在两个OutputOctets单独的结果集,例如:

InputOctetsPIVOT查询结果:

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 

如何合并两个查询结果,产生上述报告吗?

更新:

我已经更新的数据所需的报告格式源表示例中的数据相匹配。我对这种混乱表示歉意。

回答

2

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

+0

这将只是给我一个综合作用的结果,一前一后。我需要在结果中合并两个列集合。 – Kev 2009-06-29 11:44:39

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

HourX(In | Out)来自PIVOT查询,因此我可以将小时作为列名。我们只能使用PIVOT为InputOctets和OutputOctets生成一个单独的结果。 – Kev 2009-06-29 12:23:24

+0

@Kev,我想你误解了我。查询应该产生你需要的列。我只是不知道你是如何从[InputOctet] 383088和[OutputOctet] 804249到[Hour1In] 350230878. – 2009-06-29 13:16:22

+0

道歉Lieven,我更新了数据并重新调整了一下这个问题,希望更清楚一点。 – Kev 2009-06-29 14:01:09

-1

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

该报告是否绝对必须在这种格式?一个更简单,更易维护的查询可能会返回正确的信息,它只会略有不同。以下查询以不同的格式返回数据?

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

创建一个@table变量,并把所有列在表并插入i将在该表中,并在从该表中最后一个选择所有值。 意味着如果你想要24列,然后创建24列的表,并在这个插入一个接一个

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:未测试......就直SQL工作,但我有一个数据透视表没有真正的经验,这可能是挂机