我在名为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
这会在两个单独的结果集中为我提供InputOctets
和OutputOctets
,例如:
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
如何合并两个查询结果以生成上述报告?
更新
我已更新所需报告格式的数据,以匹配源表示例中的数据。我为这种困惑道歉。
答案 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