0

先週の注文と配達したドライバーの ID を含む注文テーブルがあります。次のようになります。

ORDERDATE,    ORDERNO,    DRIVER
23/01/2013,    901398503,    1
23/01/2013,    901332159,    1
23/01/2013,    901334158,    2
24/01/2013,    901338455,    1
25/01/2013,    902907513,    1
25/01/2013,    902338553,    2
25/01/2013,    903936533,    2
27/01/2013,    903944523,    1
27/01/2013,    903981522,    2
27/01/2013,    911334951,    1
28/01/2013,    911338851,    1
28/01/2013,    911339259,    1
28/01/2013,    912332555,    2
28/01/2013,    912336650,    2
29/01/2013,    912337655,    1
29/01/2013,    913969582,    1
29/01/2013,    913973583,    1
29/01/2013,    913982552,    1
29/01/2013,    916379158,    1

ORDERDATE、ORDERCOUNT、DRIVER_1_COUNT、DRIVER_2_COUNT を選択したいです。

だから、日付| 注文合計 | ドライバー 1 の合計注文数 | ドライバー 2 の合計注文数

また、ORDERDATE、ORDERCOUNT、DRIVER_1_COUNT、または DRIVER_2_COUNT が 0 (または null) の場合は、ゼロが必要です。

(オラクルでは)先週の各日の日付を選択し、次のように各日の注文数(プレースホルダー)をゼロにすることができます:

select 
 TRUNC(NEXT_DAY(sysdate,'SUNDAY')-7 +i) ORDERDATE,
 0 as ORDERCOUNT   
from
 (select rownum i from all_objects where rownum < 8)

この出力を使用して、最終結果に欠落している日がないことを確認できるはずです (この例では 26 日に注文はありません)。

ORDERDATE,ORDERCOUNT
23/01/2013,0
24/01/2013,0
25/01/2013,0
26/01/2013,0
27/01/2013,0
28/01/2013,0
29/01/2013,0

この出力が必要です:

ORDERDATE,ORDERCOUNT,DRIVER_1_COUNT,DRIVER_2_COUNT
23/01/2013,3,2,1
24/01/2013,1,1,0
25/01/2013,3,1,2
26/01/2013,0,0,0
27/01/2013,3,2,1
28/01/2013,4,2,2
29/01/2013,5,5,0

ORDERDATE & ORDERCOUNT(simple sum) を取得し、他のクエリと結合して、日数の欠落を回避できますが、各ドライバーの合計方法もわかりません。

よろしくお願いします。

エド

4

3 に答える 3

1

Oracle 11g では、これを行うことができます。

SELECT *
FROM orders
PIVOT (
  COUNT( ORDERNO )
  FOR DRIVER IN (1,2,3)
)

詳細については、11g のピボットおよびアンピボット クエリを参照してください。

于 2013-01-31T00:36:27.687 に答える
0

まず、結果を要約してクロス集計する必要があります。

SELECT ORDERDATE, SUM(ORDERCOUNT) ORDERCOUNT, 
SUM(DECODE(DRIVER,1,ORDERCOUNT,0)) DRIVER_1_COUNT, 
SUM(DECODE(DRIVER,2,ORDERCOUNT,0)) DRIVER_2_COUNT
FROM (
    SELECT ORDERDATE, DRIVER, COUNT(*) ORDERCOUNT
    FROM YourTable
    GROUP BY ORDERDATE, DRIVER
) S
GROUP BY  ORDERDATE

Oracleでこれを行うためのよりスマートな方法があるかもしれません

次に、これを日付に外部結合することにより、空白を埋める必要があります。

(上記のクエリは、このクエリでは「T」としてエイリアスされていることに注意してください:)

SELECT D.ORDERDATE, 
NVL(T.ORDERCOUNT,0) ORDERCOUNT, 
NVL(T.DRIVER_1_COUNT,0) DRIVER_1_COUNT, 
NVL(T.DRIVER_1_COUNT,0) DRIVER_2_COUNT
FROM 
(
SELECT ORDERDATE, SUM(ORDERCOUNT) ORDERCOUNT, 
SUM(DECODE(DRIVER,1,ORDERCOUNT,0)) DRIVER_1_COUNT, 
SUM(DECODE(DRIVER,2,ORDERCOUNT,0)) DRIVER_2_COUNT
FROM 
    (
    SELECT ORDERDATE, DRIVER, COUNT(*) ORDERCOUNT
    FROM YourTable
    GROUP BY ORDERDATE, DRIVER
    ) S
GROUP BY  ORDERDATE
) T
RIGHT OUTER JOIN
(
SELECT
TRUNC(NEXT_DAY(sysdate,'SUNDAY')-7 +i) ORDERDATE
FROM (select rownum i from all_objects where rownum < 8)
) D
ON D.ORDERDATE = T.ORDERDATE
于 2013-01-31T00:02:49.653 に答える
0

サブクエリから選択する必要があります。このようなものがうまくいくはずです。

select orderdate, ordercount, sum(driver1) driver1count, sum(driver2) driver2count
from (
select orderdate
, case when driver = 1 then 1 else 0 end driver1
, case when driver = 2 then 1 else 0 end driver2
, count(*) ordercount

from yourtable

where whatever

group by orderdate
, case when driver = 1 then 1 else 0 end driver1
, case when driver = 2 then 1 else 0 end driver2

) you_need_an_alias_here

group by orderdate, ordercount

order by orderdate
于 2013-01-31T00:06:31.627 に答える