2014-04-03 37 views
1

我試圖創建一個交叉,但我需要一個類型的查詢,通過cia_ensures如何在一組總和中顯示0?

我的表重複每個policy_business_unit組:

|policies| 
    |id| |client| |policy_business_unit_id| |cia_ensure_id| |state|  
    1  MATT     1     1    0 
    2  STEVE     1     2    1 
    3  BILL     1     3    2 
    4  LARRY     1     4    0 

|policy_business_units| 
    |id| |name| |comercial_area_id| 
    1  LIFE   1 

|comercial_areas| 
    |id| |name| 
    1  BANK 

|cia_ensures| 
    |id| |name| 
    1  SPRINT 
    2  APPLE 
    3  PEPSI 
    4  ORANGE 
    5  BT 

這裏是信息:

http://sqlfiddle.com/#!2/37690/2 

我試圖使用所有cia_ensures顯示計算結果:

SELECT ce.name AS CIAS, pb.name AS UNIT, 
    SUM(CASE WHEN p.state =0 THEN 1 ELSE 0 END) AS ACTIVES, 
    SUM(CASE WHEN p.state =1 THEN 1 ELSE 0 END) AS INACTIVES, 
    SUM(CASE WHEN p.state =2 THEN 1 ELSE 0 END) AS OTHERS 
From policies p 
    INNER JOIN policy_business_units pb ON pb.id = p.policy_business_unit_id 
    INNER JOIN comercial_areas ca ON ca.id = pb.comercial_area_id 
    INNER JOIN cia_ensures ce ON ce.id = p.cia_ensure_id 
WHERE policy_business_unit_id IN (1) 
GROUP BY cia_ensure_id 

我得到這個結果:

UNIT    CIAS  COMERCIAL_AREAS STATE_0 STATE_1 STATUS_2 
LIFE   SPRINT  BANK     1  0   0 
LIFE   APPLE  BANK     0  1   0 
LIFE   PEPSI  BANK     0  0   1 
LIFE   ORANGE  BANK     1  0   0 

這裏是我的問題: 我想告訴所有cia_ensure_id,如果這沒有關係顯示0

我該怎麼做纔能有這樣的結果?

UNIT    CIAS  COMERCIAL_AREAS STATE_0 STATE_1 STATUS_2 
LIFE   SPRINT  BANK     1  0   0 
LIFE   APPLE  BANK     0  1   0 
LIFE   PEPSI  BANK     0  0   1 
LIFE   ORANGE  BANK     1  0   0 
LIFE   BT   BANK     0  0   0 

我試圖

SELECT ce.name AS CIAS, pb.name AS UNIT, 
    SUM(CASE WHEN p.state =0 THEN 1 ELSE 0 END) AS ACTIVES, 
    SUM(CASE WHEN p.state =1 THEN 1 ELSE 0 END) AS INACTIVES, 
    SUM(CASE WHEN p.state =2 THEN 1 ELSE 0 END) AS OTHERS 
From policies p 
    INNER JOIN policy_business_units pb ON pb.id = p.policy_business_unit_id 
    INNER JOIN comercial_areas ca ON ca.id = pb.comercial_area_id 
    INNER JOIN cia_ensures ce ON ce.id = p.cia_ensure_id 
WHERE policy_business_unit_id IN (1) AND cia_ensured_id IN (1,2,3,4,5) 
GROUP BY cia_ensure_id 

所有形式的幫助將被接受。

請給我所有的幫助。

謝謝。

+0

將連接更改爲cia_ensures上的外連接。 INNER連接必須在每個表中都有記錄,否則會被排除。外部連接(左側,右側或全部)將顯示左側或右側或兩個表中的所有記錄。除非在where子句中過濾掉。 – xQbert

+0

在LEFT JOIN上閱讀,我想這就是你要找的。 – RobP

+0

好吧,我改變了「外部連接cia_ensures ce在ce.id = p.cia_ensure_id」,但得到錯誤 –

回答

2
SELECT ce.name AS CIAS, pb.name AS UNIT, 
    SUM(CASE WHEN p.state =0 THEN 1 ELSE 0 END) AS ACTIVES, 
    SUM(CASE WHEN p.state =1 THEN 1 ELSE 0 END) AS INACTIVES, 
    SUM(CASE WHEN p.state =2 THEN 1 ELSE 0 END) AS OTHERS 
From policies p 
    INNER JOIN policy_business_units pb ON pb.id = p.policy_business_unit_id 
    INNER JOIN comercial_areas ca ON ca.id = pb.comercial_area_id 
    RIGHT JOIN cia_ensures ce ON ce.id = p.cia_ensure_id 
WHERE (policy_business_unit_id IN (1) or policy_business_unit_id is null) 
GROUP BY cia_ensure_id 

將內部更改爲右側,如果它位於其他表之前,則可以留下,因爲它是最後一個表。基本上你需要CIA的所有記錄,只有那些在其他表格中匹配的記錄。

請注意,您還必須在policy_business_Unit上查找空值,否則(1)會排除右連接添加的行。

或移動標準的加入讓這只是加入

SELECT ce.name AS CIAS, pb.name AS UNIT, 
    SUM(CASE WHEN p.state =0 THEN 1 ELSE 0 END) AS ACTIVES, 
    SUM(CASE WHEN p.state =1 THEN 1 ELSE 0 END) AS INACTIVES, 
    SUM(CASE WHEN p.state =2 THEN 1 ELSE 0 END) AS OTHERS 
From policies p 
    INNER JOIN policy_business_units pb 
    ON pb.id = p.policy_business_unit_id 
    and policy_business_unit_id IN (1) 
    INNER JOIN comercial_areas ca ON ca.id = pb.comercial_area_id 
    RIGHT JOIN cia_ensures ce ON ce.id = p.cia_ensure_id 
GROUP BY cia_ensure_id 

假設所有NULL PB.names可以閱讀「生活」則改變第一選擇線讀之前應用的行...但是這對我來說是一個糟糕的假設。所以除非有一條規則來管理這個,否則null應該是基於設計的有效響應。

SELECT ce.name AS CIAS, coalesce(pb.name,'LIFE') AS UNIT, 
+1

燒燬由mySQL的實施按組更改由「ce.name」http://sqlfiddle.com/#!2/ 657b6/8/0 – xQbert

+1

問題在於你引用了策略cia_ensure_ID策略可能不存在於你想要顯示的cia_ensure中,因此你必須改變查看cia_ensures ID而不是策略中的策略( http://sqlfiddle.com/#!2/657b6/22/0)假設你仍然想要所有的cia_ensures,但只有你的列表中的那些,你需要繼續在policy_business_business_Id上使用空符號,否則你會過濾掉cia_ensures以及。 – xQbert

+1

您確實需要在有外連接的情況下查看where子句,並且where子句必須移至Join本身,或者將條件評估爲或爲空。否則外連接失效。在這種情況下http://sqlfiddle.com/#!2/657b6/24/0你會注意到我所做的只是添加'(pb.id = 1或者Pb.id爲空)'或者pb.id是空值。 – xQbert