-2

以下のような一連のレコードを返すクエリがあります:-

Date    Dept        commission

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

ケース 1: 1 月 1 日から 4 月 5 日の間にクエリを実行すると、

Date    Dept        commission

5 April Sales       76

ケース 2: 1 月 1 日から 1 月 31 日の間にクエリを実行すると、次のような出力が得られます。

Date    Dept        commission

1 Jan   Marketing   35

ケース 2 は、必要な結果を取得する日付範囲を入力したときのように単純ですが、ケース 1 を処理して最大/最新の日付、その日付の部門、およびその部門の手数料の合計、日付の日付を表示する方法がわかりません。選択した日付範囲。出力は、選択した日付範囲の合計 (手数料) を含む最新の日付と部門を含む単一の行になります。

4

1 に答える 1

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-fiddle、test-1が示すように、SQL-Server、MySQL、Postgres で機能しますが、Oracle 11g 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)、最大日付の行が複数ある場合に対処するために使用されSalesますMarketingApr-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
于 2012-04-08T07:44:51.073 に答える