Как объединить / объединить столбцы из двух результатов SQL-запроса? - PullRequest
7 голосов
/ 29 июня 2009

У меня есть набор данных в таблице с именем 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

Как объединить результаты двух запросов, чтобы получить отчет выше?

Обновление:

Я обновил данные в желаемом формате отчета, чтобы он соответствовал данным в примере исходной таблицы. Мои извинения за путаницу.

Ответы [ 5 ]

3 голосов
/ 29 июня 2009

Я понятия не имею, как вы вычисляете ваш HourX (In | Out) из ваших (Input | Output) октетов, но следующие могут работать для вас

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)
2 голосов
/ 29 июня 2009

используйте объединение или объединение всех для объединения двух результатов.

1 голос
/ 29 июня 2009

у вас есть два запроса ... поэтому я думаю, что вы можете просто использовать эти два запроса в качестве "таблиц" в запросе-обертке и объединить их


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, но у меня нет реального опыта работы с сводными таблицами, и это может быть зависанием

0 голосов
/ 29 июня 2009

Создайте одну переменную @table, поместите все столбцы в эту таблицу, вставьте в нее все значения в этой таблице и, наконец, выберите из этой таблицы. означает, что если вы хотите 24 столбца, то создайте таблицу с 24 столбцами и вставьте одну за другой строку в этот

0 голосов
/ 29 июня 2009

Этот ответ приходит из школы SQL-запросов Agile / YAGNI .....

Обязательно ли отчет должен быть в этом формате? Более простой, более обслуживаемый запрос может вернуть правильную информацию, он будет представлен немного по-другому. Следующий запрос возвращает данные в несколько ином формате?

SELECT serviceid, hour, SUM(InputOctets) AS InputOctets, SUM(OutputOctets) AS OutputOctets
FROM BWHourlyReadings
GROUP BY serviceid, hour
ORDER BY serviceid, hour
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...