2017-04-20 77 views
1

我想編制一份報告,顯示項目是否在一年的每個月中完成。有多少項目完成並不重要,只是項目是否完成。如何使用Oracle SQL爲每個月選擇一列的選擇最大值

with project_data as(
select '123' account, 'Started' status, to_date('01/01/2017','MM/DD/YY') 
sale_date from dual union all 
select '123' account, 'Complete' status, to_date('01/15/2017','MM/DD/YY') 
sale_date from dual union all 
select '123' account, 'Started' status, to_date('02/01/2017','MM/DD/YY') 
sale_date from dual union all 
select '123' account, 'Complete' status, to_date('04/12/2017','MM/DD/YY') 
sale_date from dual union all 
select '123' account, 'Complete' status, to_date('04/16/2017','MM/DD/YY') 
sale_date from dual) 

從這個例子中我想輸出到如:

Account Completed Month Year 
123  Yes  1  2017 
123  No  2  2017 
123  No  3  2017 
123  Yes  4  2017 
+1

你需要一個月,是不是出現在你的輸入數據的行(在你的榜樣,您顯示的3個月值的行,但沒有排在3月的日期)?如果是這樣,你接受的解決方案似乎並沒有這樣做。所以 - 你的問題陳述是不正確的,還是被接受的答案實際上不是你所需要的? – mathguy

+0

接受的答案並沒有做我所需要的一切。我接受它是因爲這是一個很好的解決方案,並且會爲我工作,但有一項要求錯過了。我未接受解決方案並發表評論。謝謝。 – mjanach

回答

1

甲骨文設置

CREATE TABLE table_name (account, status, sale_date) AS 
    select '123', 'Started', DATE '2017-01-01' from dual union all 
    select '123', 'Complete', DATE '2017-01-15' from dual union all 
    select '123', 'Started', DATE '2017-02-01' from dual union all 
    select '123', 'Complete', DATE '2017-04-12' from dual union all 
    select '123', 'Complete', DATE '2017-04-16' from dual union all 
    select '456', 'Complete', DATE '2017-03-28' from dual; 

查詢

SELECT ACCOUNT, 
     MONTH, 
     CASE COUNT(CASE status WHEN 'Complete' THEN 1 END) 
     WHEN 0 
     THEN 'No' 
     ELSE 'Yes' 
     END AS Completed 
FROM (SELECT ADD_MONTHS(TRUNC(SYSDATE, 'YEAR'), LEVEL - 1) AS month 
     FROM DUAL 
     CONNECT BY ADD_MONTHS(TRUNC(SYSDATE, 'YEAR'), LEVEL - 1) <= SYSDATE) 
     LEFT OUTER JOIN 
     table_name t 
     PARTITION BY (t.account) 
     ON (month <= sale_date AND sale_date < ADD_MONTHS(month, 1)) 
GROUP BY Account, Month 
ORDER BY Account, Month; 

輸出

ACC MONTH    COM 
--- ------------------- --- 
123 2017-01-01 00:00:00 Yes 
123 2017-02-01 00:00:00 No 
123 2017-03-01 00:00:00 No 
123 2017-04-01 00:00:00 Yes 
456 2017-01-01 00:00:00 No 
456 2017-02-01 00:00:00 No 
456 2017-03-01 00:00:00 Yes 
456 2017-04-01 00:00:00 No 
+0

這很好,謝謝! – mjanach

2
SELECT YEAR, 
     MONTH, 
     ACCOUNT, 
     CASE WHEN COMPLETED > 0 THEN 'YES' ELSE 'NO' END AS AT_LEAST_ONE_COMP 
    FROM ( SELECT EXTRACT (YEAR FROM SALE_DATE) AS YEAR, 
       EXTRACT (MONTH FROM SALE_DATE) AS MONTH, 
       ACCOUNT, 
       SUM (CASE WHEN STATUS = 'Complete' THEN 1 ELSE 0 END) 
        AS completed 
      FROM MY_TABLE 
     GROUP BY EXTRACT (YEAR FROM SALE_DATE), 
       EXTRACT (MONTH FROM SALE_DATE), 
       ACCOUNT) 
+0

這很好用,謝謝! – mjanach

+0

我想看看是否有人可以提出一個解決方案,該解決方案可以解決未在此解決方案中返回的March問題。 – mjanach

+0

您提供的數據不包含3月份的條目。 –