簡體   English   中英

如何跨多個字段創建條件計數?

[英]How do you create a conditional count across multiple fields?

我有超過1億行數據的巨大表格,它連接到另一個我想為其創建條件計數的參考表。

第一個表是較大的表,它是審計日志,包含列出國家數據並包含審計日期的數據。 第二個表是一個較小的表,其中包含審計日志的關系數據。 第一部分是簡單的位,用於識別我想要查看的審計數據。 我有以下代碼來識別這個:

    select aud.*
    from audit_log aud
    join database db on db.id=aud.release_id
    where aud.event_description like '% opted in'
    and r.creation_source = 'system_a'

這給了我以下格式的數據:

Country             Event Description                                   Audit Date
Czech Republic      Czech Republic has been automatically opted in      11-AUG-14 07.01.52.606000000
Denmark             Denmark has been automatically opted in             12-AUG-15 07.01.53.239000000
Denmark             Denmark has been automatically opted in             11-SEP-15 07.01.53.902000000
Dominican Republic  Dominican Republic has been automatically opted in  11-SEP-15 07.01.54.187000000
Ecuador             Ecuador  has been automatically opted in            11-DEC-14 07.01.54.427000000
Ecuador             Ecuador has been automatically opted in             11-NOV-14 07.01.54.679000000

此查詢的結果數仍會返回超過500萬行,因此我無法將數據導出到Excel以創建計數。 我的兩個主要問題是行數和“審核日期”字段的日期格式。

理想情況下,我想創建一個顯示數據的計數:

Country                |Aug-14|Nov-14|Dec-14|Aug-15|Sep-15
Czech Republic         |  1   |      |      |      |
Denmark                |      |      |      |  1   | 1
Dominican Republic     |      |      |      |      | 1
Ecuador                |      | 1    |  1   |      |        

有什么想法我如何提取月份和年份並將數據逐個列地刪除?

謝謝

編輯 - 謝謝xQbert為您解決方案,它完美無缺! 現在的問題是我遇到了一個新問題。 我需要通過另一個查詢來約束計數,但是所涉及的表之間沒有唯一的標識符。

例如,我修改了您的查詢以適合我的數據庫:

select cty.country_name, 
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='AUG-2014' then 1 else 0 end) as "AUG-14",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='SEP-2014' then 1 else 0 end) as "SEP-14",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='OCT-2014' then 1 else 0 end) as "OCT-14",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='NOV-2014' then 1 else 0 end) as "NOV-14",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='DEC-2014' then 1 else 0 end) as "DEC-14",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='JAN-2015' then 1 else 0 end) as "JAN-15",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='FEB-2015' then 1 else 0 end) as "FEB-15",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='MAR-2015' then 1 else 0 end) as "MAR-15",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='APR-2015' then 1 else 0 end) as "APR-15",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='MAY-2015' then 1 else 0 end) as "MAY-15",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='JUN-2015' then 1 else 0 end) as "JUN-15",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='JUL-2015' then 1 else 0 end) as "JUL-15",
    SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='AUG-2015' then 1 else 0 end) as "AUG-15",
    SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='SEP-2015' then 1 else 0 end) as "SEP-15"
    from dschd.audit_trail aud
    join dschd.release r on r.id=aud.release_id
    join dschd.country cty on aud.EVENT_COUNTRY_ID=cty.id
    where aud.event_description like '% opted in'
    and r.creation_source = 'DSCHED'
    GROUP BY cty.COUNTRY_name

我的第二個問題是:

select  *
from DSCHD.RELEASE_COUNTRY_RIGHT rcr
join dschd.release r on rcr.RELEASE_ID=r.ID
join dschd.country cty on rcr.COUNTRY_ID=cty.id
where r.release_status in ('DRAFT', 'SCHEDULED', 'FINAL', 'DELIVERED')
and r.is_active = 'Y'
and rcr.MARKETING_RIGHT = 'Y'
and rcr.OPT_OUT = 'N'
and r.creation_source = 'DSCHED'

問題是我有許多國家可以與一個ID(Release_ID)相關,但國家層面的表之間沒有唯一的標識符。 每個國家都有一個ID。

因此對於查詢1,要識別每個唯一行,我需要'aud.Release_ID'和'aud.Event_country_id',而對於查詢2來實現相同的我需要使用'rcr.Release_ID'和'rcr.country_id ”。

select cty.country_name, 
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='AUG-2014' then 1 else 0 end) as "AUG-14",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='SEP-2014' then 1 else 0 end) as "SEP-14",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='OCT-2014' then 1 else 0 end) as "OCT-14",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='NOV-2014' then 1 else 0 end) as "NOV-14",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='DEC-2014' then 1 else 0 end) as "DEC-14",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='JAN-2015' then 1 else 0 end) as "JAN-15",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='FEB-2015' then 1 else 0 end) as "FEB-15",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='MAR-2015' then 1 else 0 end) as "MAR-15",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='APR-2015' then 1 else 0 end) as "APR-15",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='MAY-2015' then 1 else 0 end) as "MAY-15",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='JUN-2015' then 1 else 0 end) as "JUN-15",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='JUL-2015' then 1 else 0 end) as "JUL-15",
    SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='AUG-2015' then 1 else 0 end) as "AUG-15",
    SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='SEP-2015' then 1 else 0 end) as "SEP-15"
    from dschd.audit_trail aud
    join dschd.release r on r.id=aud.release_id
    join dschd.country cty on aud.EVENT_COUNTRY_ID=cty.id
    where aud.event_description like '% opted in'
    and ***** in (select  ******
                 from DSCHD.RELEASE_COUNTRY_RIGHT rcr
                 join dschd.release r on rcr.RELEASE_ID=r.ID
                 join dschd.country cty on rcr.COUNTRY_ID=cty.id
                 where r.release_status in ('DRAFT', 'SCHEDULED', 'FINAL', 'DELIVERED')
                 and r.is_active = 'Y'
                 and rcr.MARKETING_RIGHT = 'Y'
                 and rcr.OPT_OUT = 'N'
                 and r.creation_source = 'DSCHED')
GROUP BY cty.COUNTRY_name

我被困住的位是兩個部分,由'*****'表示,因為連接標准是兩個字段。

有任何想法嗎?

快速而骯臟,不是基於12個月或任何東西的動態浮動......

select country, 
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='AUG-2014' then 1 else 0 end) as "AUG-14",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='SEP-2014' then 1 else 0 end) as "SEP-14",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='OCT-2014' then 1 else 0 end) as "OCT-14",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='NOV-2014' then 1 else 0 end) as "NOV-14",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='DEC-2014' then 1 else 0 end) as "DEC-14",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='JAN-2015' then 1 else 0 end) as "JAN-15",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='FEB-2015' then 1 else 0 end) as "FEB-15",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='MAR-2015' then 1 else 0 end) as "MAR-15",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='APR-2015' then 1 else 0 end) as "APR-15",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='MAY-2015' then 1 else 0 end) as "MAY-15",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='JUN-2015' then 1 else 0 end) as "JUN-15",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='JUL-2015' then 1 else 0 end) as "JUL-15",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='AUG-2015' then 1 else 0 end) as "AUG-15",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='SEP-2015' then 1 else 0 end) as "SEP-15"

    from audit_log aud
    join database db on db.id=aud.release_id
    where aud.event_description like '% opted in'
    and r.creation_source = 'system_a'
GROUP BY COUNTRY

理想情況下,我們只是簡單地使用Pivot語句或基於范圍內的最早日期並繼續...如在此先前的堆棧文章中找到oracle sql中的動態透視

根據不斷變化的要求更新您知道您可以加入多個標准嗎? :P

請注意,我們使用您的第二個查詢創建了一個內聯視圖,將其別名為z表名,然后添加兩個匹配的列作為結果的一部分。 然后我們加入它,好像它是一張桌子!

select cty.country_name, 
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='AUG-2014' then 1 else 0 end) as "AUG-14",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='SEP-2014' then 1 else 0 end) as "SEP-14",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='OCT-2014' then 1 else 0 end) as "OCT-14",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='NOV-2014' then 1 else 0 end) as "NOV-14",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='DEC-2014' then 1 else 0 end) as "DEC-14",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='JAN-2015' then 1 else 0 end) as "JAN-15",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='FEB-2015' then 1 else 0 end) as "FEB-15",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='MAR-2015' then 1 else 0 end) as "MAR-15",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='APR-2015' then 1 else 0 end) as "APR-15",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='MAY-2015' then 1 else 0 end) as "MAY-15",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='JUN-2015' then 1 else 0 end) as "JUN-15",
SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='JUL-2015' then 1 else 0 end) as "JUL-15",
    SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='AUG-2015' then 1 else 0 end) as "AUG-15",
    SUM(CASE WHEN to_char(Audit_Date,'MON-YYYY') ='SEP-2015' then 1 else 0 end) as "SEP-15"
    from dschd.audit_trail aud
    join dschd.release r on r.id=aud.release_id
    join dschd.country cty on aud.EVENT_COUNTRY_ID=cty.id
    join (select  Release_ID, country_id
                 from DSCHD.RELEASE_COUNTRY_RIGHT rcr
                 join dschd.release r on rcr.RELEASE_ID=r.ID
                 join dschd.country cty on rcr.COUNTRY_ID=cty.id
                 where r.release_status in ('DRAFT', 'SCHEDULED', 'FINAL', 'DELIVERED')
                 and r.is_active = 'Y'
                 and rcr.MARKETING_RIGHT = 'Y'
                 and rcr.OPT_OUT = 'N'
                 and r.creation_source = 'DSCHED') Z
       ON aud.Release_ID = z.Realease_ID and
          aud.Event_country_id = z.country_id
    where aud.event_description like '% opted in'
GROUP BY cty.COUNTRY_name

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM