[英]How can show 0 in a group of sum?
我正在嘗試創建一個交叉表,但我需要一種通過cia_ensures重復每個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
各種幫助都會被接受。
請給我各種各樣的幫助。
謝謝。
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.name都可以讀取'LIFE',然后將第一條選擇行更改為......但這對我來說是一個錯誤的假設。 因此,除非有管理此規則的規則,否則null應該是基於設計的有效響應。
SELECT ce.name AS CIAS, coalesce(pb.name,'LIFE') AS UNIT,
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.