1

いくつかのチャートを作成したいテーブルがあります。基本的に、10 分間隔でいくつのレジスターがあり、そのうちのいくつが後処理されているかを知る必要があります。この 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)

2 番目のクエリ

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)

共通フィールドが動的に生成される場合、どうすれば結合できますか?

4

3 に答える 3

1

Hora他の人がすでに言っているように、2つのクエリを派生テーブル(副選択)として使用し、それぞれの列を使用してそれらを結合することができます。列がクエリで計算されるかどうかは関係ありません。結合条件で使用することは完全に合法です。

ただし、1つのクエリで(つまり、サブクエリなしで)両方のカウントを計算することで、同じ結果をより効率的に取得できると思います。これを行う方法は次のとおりです。

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列の行をカウントするときに使用されます。2番目の引数はCOUNTCASE式です。1指定された条件が満たされた場合、またはそうでない場合は、値を返します(任意に選択されますが、実際には何でもかまいません) NULL。nullを省略しているためCOUNT、結果は、を計算して返す専用クエリの場合と同じになりますSucesso

于 2012-09-20T19:39:07.900 に答える
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
于 2012-09-20T19:05:04.090 に答える
0

出力を次のようにしたいと想定しています。

Hora | Movimentações | Sucesso

WITH次のステートメントを使用すると、2 つの SQL クエリをテーブルのように使用できます。

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
于 2012-09-20T19:00:07.517 に答える