2012-04-08 3 views
-2

私は以下のようなとしてレコードのセットを返すクエリがあります: -ユニーク行

Date Dept  commission 

5-Apr Sales  20 
4-Apr Sales  21 
1-Jan Marketing 35 

ケース1:私は1月1日と4月5日のI間のクエリを実行する場合

Date Dept  commission 

5 April Sales  76 

ケース2を取得する必要があります:私は1月1日と1月31日の間でクエリを実行すると

として出力を取得する必要があります
Date Dept  commission 

1 Jan Marketing 35 

ケース2は、MAX /最新の日付、その日のための部門と和のを示すために、ケース1を処理する方法がわから私は必要な結果を得る敬遠しがち日付範囲を入れたときのように単純ではないが、そのDeptの手数料、選択した日付範囲の日付。出力は、選択した日付範囲の合計(手数料)を含む最新の日付と部門の1行になります。

+1

:最初のケースでクエリを実行すると、4aprilと4月5日が得られます。ケース2では4月4日と5日が得られますが、結果は異なっていますか? –

+0

こんにちは申し訳ありませんが、それは1月1日から31日jan –

+0

する必要があります私の最後からのタイプミスでしたそして、その '71'はどこから来たのですか? @プリヤ:質問を編集できます。 –

答えて

3
SELECT 
    MAX(Date)      AS Date 
    , (SELECT tt.Dept        
     FROM tableX tt 
     WHERE tt.Date = MAX(t.Date) 
    )        AS Dept 
    , SUM(Commission)    AS Commission 
FROM 
    tableX t 
WHERE 
    Date BETWEEN StartDate AND EndDate 

SQL-Serverで上記の作品、sql-fiddle, test-1ショーなどのMySQL、Postgresは、しかし、それは、Oracle 11グラムR2では動作しません!


これは(sql-fiddle, test-2)にもかかわらず動作します:

SELECT 
    MAX(t.Date)  AS Date 
    , MIN(tt.Dept)  AS Dept    --- MIN, MAX irrelevant 
    , SUM(t.Commission) AS Commission 
FROM 
    (SELECT 
     MAX(Date)      AS Date 
    , SUM(Commission)    AS Commission 
    FROM 
     tableX 
    WHERE 
     Date BETWEEN StartDate AND EndDate 
) t 
    JOIN 
    tableX tt 
     ON tt.Date = t.Date 

MIN(tt.Dept)はあなたが最大日付で行以上のものを持っている場合の世話をするために使用され、SalesMarketingとの1で1行を言います

Apr-5

の両方これは、LAST_VALUE分析関数(sql-fiddle, test-3)を使用しても、動作し

SELECT 
    MAX(Date)  AS Date 
    , MIN(Dept)  AS Dept    
    , SUM(Commission) AS Commission 
FROM 
    (SELECT 
     Date      AS Date 
    , LAST_VALUE(Dept) OVER(ORDER BY Date 
       ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING 
          ) AS Dept 
    , Commission    AS Commission 
    FROM 
     tableX 
    WHERE 
     Date BETWEEN StartDate AND EndDate 
) t 
+0

あなたの質問と回答を試みます。 –

+0

いいえ、間違っています。私は最初に編集しましょう。 –