2017-06-15 6 views
-1

25個の列ヘッダーを持つ100万行以上のテーブルからデータを取得しています。私は、合計の応答コールと合計接続秒数を取得する単純なクエリを持っています。SQL Server - 最初の300行(および301+)に基づく列の合計

SELECT 
convert(date,format(Dateadd(hh,1,[Start Time]),'dd/MM/yyyy'),103) as [Date] 
,sum(iif([type] = 'normal operator call',1,0)) as [answered calls] 
,sum([connected (secs)]) as [total con sec] 


from inboundcallsview 

where [account] = '106844' 

and dateadd(hh,1,[start time]) between '2017-05-01' and '2017-06-01' 

group by convert(date,format(Dateadd(hh,1,[Start Time]),'dd/MM/yyyy'),103) 

私は何を探していますと、([開始時刻]列で)最初の300の接続秒のコールに答え和である(任意の行ここで、[タイプ] =「通常のオペレータコール」)それぞれの([日付]列で定義されているとおり)。 301以降のすべてのコールの接続秒数も表示されます。基本的に私の現在の出力が

current

であり、私はそれが6月

desired output

も日付の変更を無視したい(06)であるべきかもしれない(05)私は私の作成めちゃめちゃ例。私は最終的にすべての日付のためにこれをしたいと思うので、日付のパラメータは特に重要ではありません。

ありがとうございます。擬似コードで

+0

を使用すると、ROW_NUMBER関数について知っていますか? –

+0

私はそれが存在することを知っていますが、私はすでに分割して日付と日付ごとの行の数をグループ化しているときにそれを組み込む方法は不規則になります。それは私が私の計算に助けを必要とするものです。そこにはそれ自身のサブテーブルである各日付を作るための何らかの方法があり、そのサブテーブルの行をおそらく数えますか?どのように見えるだろうか? – tomdemaine

+0

'OVER(PARTITION BY(あなたの日付出力)ORDER BY [開始時刻])で' ROW_NUMBER'を使うことに注意してください。ところで、2つの派生テーブルを結合する必要があります。 1-300のテーブルと301 + –

答えて

1

それは次のようになります。

WITH CTE AS (
    SELECT {Your Date Output} AS [date], 
     ,[ConnectedSecs] 
     ROW_NUMBER() OVER (PARTITION BY {Your Date Output}, ORDER BY [Start Time]) AS rn 
    FROM YourTable 
    WHERE {Conditions} 
) 
SELECT 
    [date], 
    'First 300' AS Bracket, 
    SUM(ConnectedSecs) 
    FROM CTE WHERE rn < 301 
    GROUP BY [date] 
UNION ALL SELECT 
    [date], 
    '301+' AS Bracket, 
    SUM(ConnectedSecs) 
    FROM CTE WHERE rn >= 301 
    GROUP BY [date] 
ORDER BY [date],{a case expression to have 'First 300' on top if desired} 
+0

という別のテーブルこれは非常に便利です、ありがとう! – tomdemaine

関連する問題