2012-09-20 22 views
1

我有一張表,我想創建一些圖表。 基本上我需要知道在10分鐘的時間間隔內有多少個寄存器,以及它們中有多少個已經進行了後處理。有了這2個查詢我有我需要的信息,但我只需要他們2在1結果表。加入2條查詢,可動態創建相同的字段

首先查詢

SELECT 
    (
     CAST(DATEPART(HOUR, m.Ocr_DataHora) AS NVARCHAR) + 
     ':' + 
     CAST((DATEPART(MINUTE, m.Ocr_DataHora) % 6) AS NVARCHAR) + 
     '0'   
    )          AS Hora, 
    COUNT(*)        AS Movimentações 
FROM 
    Integracao m 
WHERE 
     m.Ocr_DataHora  >= '2012-09-17 00:00:00.000' 
    AND m.Ocr_DataHora  < '2012-09-18 00:00:00.000' 
GROUP BY   
    DATEPART(HOUR, m.Ocr_DataHora), 
    (DATEPART(MINUTE, m.Ocr_DataHora) % 6) 
ORDER BY  
    DATEPART(HOUR, m.Ocr_DataHora), 
    (DATEPART(MINUTE, m.Ocr_DataHora) % 6) 

第二查詢,如果是動態生成的我的共同領域

SELECT 
    (
     CAST(DATEPART(HOUR, s.Ocr_DataHora) AS NVARCHAR) + 
     ':' + 
     CAST((DATEPART(MINUTE, s.Ocr_DataHora) % 6) AS NVARCHAR) + 
     '0'   
    )          AS Hora, 
    COUNT(*)        AS Sucesso 
FROM 
    Integracao s 
WHERE 
     s.Veiculo_Modelo <> '' 
    AND s.Ocr_DataHora  >= '2012-09-17 00:00:00.000' 
    AND s.Ocr_DataHora  < '2012-09-18 00:00:00.000' 
GROUP BY   
    DATEPART(HOUR, s.Ocr_DataHora), 
    (DATEPART(MINUTE, s.Ocr_DataHora) % 6) 

我怎麼能加入他們的行列?

回答

1

正如其他人已經告訴過你,你可以只使用兩個查詢的派生表(子選擇)並使用各自的Hora列加入。如果在查詢中計算列,則無關緊要,在連接條件中使用它是完全合法的。

但是,我認爲你可以通過在一個查詢中計算兩個計數(即沒有子查詢)來更有效地得到相同的結果。這裏是你如何能做到這一點:

SELECT 
    (
     CAST(DATEPART(HOUR, m.Ocr_DataHora) AS NVARCHAR) + 
     ':' + 
     CAST((DATEPART(MINUTE, m.Ocr_DataHora) % 6) AS NVARCHAR) + 
     '0'   
    )             AS Hora, 
    COUNT(*)           AS Movimentações, 
    COUNT(CASE WHEN s.Veiculo_Modelo <> '' THEN 1 END) AS Sucesso 
FROM 
    Integracao m 
WHERE 
     m.Ocr_DataHora  >= '2012-09-17 00:00:00.000' 
    AND m.Ocr_DataHora  < '2012-09-18 00:00:00.000' 
GROUP BY   
    DATEPART(HOUR, m.Ocr_DataHora), 
    (DATEPART(MINUTE, m.Ocr_DataHora) % 6) 
ORDER BY  
    DATEPART(HOUR, m.Ocr_DataHora), 
    (DATEPART(MINUTE, m.Ocr_DataHora) % 6) 

正如你所看到的,查詢不上s.Veiculo_Modelo <> ''過濾行。但是,在計算Sucesso列的行時使用該條件。第二個COUNT的論點是一個CASE表達式。如果滿足指定的條件,它會返回一個值(任意選擇爲1,但可能是任何其他值),否則返回NULL。由於COUNT省略了空值,因此結果將與您的專用查詢計算並返回Sucesso相同。

+0

我真的從來沒有,雖然我可以做計數的情況下聲明! :O即使在文檔中沒有提及任何東西! –

0

我假設你所要的輸出如下:

Hora | Movimentações | Sucesso 

您可以使用兩個SQL查詢,就好像它們是使用WITH聲明表如下:

WITH 
firstQuery(Hora, Movimentações) AS (<first query definition with out ORDER BY >), 
secondQuery(Hora, Sucesso) AS (<second query definition with out ORDER BY >) 
SELECT 
    f.Hora, f.Movimentações , s.Sucesso 
FROM 
    firstQuery f 
    JOIN secondQuery s 
    ON f.Hora = s.Hora 
0

您應該可以通過將它們放入from子句中的子查詢來完成此操作。我指的方式有以下形式:

Select A.Hora,A.Movimentações,B.Sucesso 
From (*First Query*) as A 
inner join (*Second Query*) as B on A.Hora = B.Hora 

最終結果是:

Select A.Hora,A.Movimentações,B.Sucesso 
From (SELECT 
    (
     CAST(DATEPART(HOUR, m.Ocr_DataHora) AS NVARCHAR) + 
     ':' + 
     CAST((DATEPART(MINUTE, m.Ocr_DataHora) % 6) AS NVARCHAR) + 
     '0'   
    )          AS Hora, 
    COUNT(*)        AS Movimentações 
FROM 
    Integracao m 
WHERE 
     m.Ocr_DataHora  >= '2012-09-17 00:00:00.000' 
    AND m.Ocr_DataHora  < '2012-09-18 00:00:00.000' 
GROUP BY   
    DATEPART(HOUR, m.Ocr_DataHora), 
    (DATEPART(MINUTE, m.Ocr_DataHora) % 6) 
ORDER BY  
    DATEPART(HOUR, m.Ocr_DataHora), 
    (DATEPART(MINUTE, m.Ocr_DataHora) % 6)) As A 
inner join (SELECT 
    (
     CAST(DATEPART(HOUR, s.Ocr_DataHora) AS NVARCHAR) + 
     ':' + 
     CAST((DATEPART(MINUTE, s.Ocr_DataHora) % 6) AS NVARCHAR) + 
     '0'   
    )          AS Hora, 
    COUNT(*)        AS Sucesso 
FROM 
    Integracao s 
WHERE 
     s.Veiculo_Modelo <> '' 
    AND s.Ocr_DataHora  >= '2012-09-17 00:00:00.000' 
    AND s.Ocr_DataHora  < '2012-09-18 00:00:00.000' 
GROUP BY   
    DATEPART(HOUR, s.Ocr_DataHora), 
    (DATEPART(MINUTE, s.Ocr_DataHora) % 6)) As B on B.Hora = A.Hora