[英]need to get the query right to get unique data count based on conditions
在下面提到的查詢之一中需要幫助時,我想對id(Distinct)的條件進行計數,1)如果與該id關聯的所有三個結構都具有STATUS AS“ SUCCESS”,則稱為交付。 2)如果任何結構僅關聯1或2個結構,並且狀態為成功,但是其中一個結構丟失,則其掛起。
3)如果所有三個結構都存在,但是任何一個結構狀態失敗,則將其計為未決。
這是我為獲取下表而編寫的查詢,
select m.id, p.group, p.structure, p.STATUS
from table_M m
join table_O o on o.id = m.id
join table_P p on ofenIdent.ref_id = p.ref_id
where m.group = 'grp01'
and p.status_flag = 'process'
and p.structure IN ('X','Y','Z')
limit 50;
| id | group | structure | STATUS |
|------------|-----|-------------------|---------|
| 7 | grp01 | X | SUCCESS |
| 7 | grp01 | X | SUCCESS |
| 7 | grp01 |Y | SUCCESS |
| 7 | grp01 |Y | SUCCESS |
| 7 | grp01 | Z | SUCCESS |
| 7 | grp01 | Z | SUCCESS |
| 9 | grp01 | X | SUCCESS |
| 9 | grp01 |Y | SUCCESS |
| 9 | grp01 | Z | FAILURE |
| 0 | grp01 | X | SUCCESS |
| 0 | grp01 |Y | SUCCESS |
| 0 | grp01 | Z | FAILURE |
| 2 | grp01 | X | SUCCESS |
| 2 | grp01 |Y | SUCCESS |
| 2 | grp01 | Z | FAILURE |
| 4 | grp01 | X | SUCCESS |
| 4 | grp01 | X | SUCCESS |
| 4 | grp01 | X | SUCCESS |
| 4 | grp01 | X | SUCCESS |
| 4 | grp01 | X | SUCCESS |
| 3 | grp01 | X | SUCCESS |
| 3 | grp01 |Y | SUCCESS |
| 3 | grp01 | Z | FAILURE |
| 4 | grp01 |Y | FAILURE |
| 4 | grp01 |Y | FAILURE |
| 4 | grp01 |Y | FAILURE |
| 4 | grp01 |Y | FAILURE |
| 4 | grp01 |Y | FAILURE |
| 4 | grp01 | Z | SUCCESS |
| 4| grp01 | Z | SUCCESS |
| 4 | grp01 | Z | SUCCESS |
| 4 | grp01 | Z | SUCCESS |
| 4 | grp01 | Z | SUCCESS |
| 4 | grp01 | Z | SUCCESS |
| 4 | grp01 | Z | SUCCESS |
| 4 | grp01 | Z | SUCCESS |
| 4 | grp01 | Z | SUCCESS |
| 4 | grp01 | Z | SUCCESS |
| 5 | grp01 | X | SUCCESS |
| 5 | grp01 | X | SUCCESS |
| 5 | grp01 | X | SUCCESS |
| 5 | grp01 | X | SUCCESS |
| 6 | grp01 | X | SUCCESS |
| 5 | grp01 |Y | SUCCESS |
| 5 | grp01 |Y | SUCCESS |
| 5 | grp01 |Y | SUCCESS |
| 5 | grp01 |Y | SUCCESS |
| 5 | grp01 | Z | SUCCESS |
| 5 | grp01 | Z | SUCCESS |
| 5 | grp01 | Z | SUCCESS |
這是MYSQL數據庫。
預期結果應該像
Structure status |Total Count
-----------------|-----------
Delivered | 2
Structure status |Total Count
-----------------|-----------
Pending | 6
根據要求提供的更多細節,我不能提及太多數據,但是這是我能提供的。
表table_M:
M_id| id| group
----|---|--------
1 |7 |grp01
2 |9 |grp01
3 |0 |grp01
4 |2 |grp01
5 |4 |grp01
6 |5 |grp01
7 |6 |grp01
8 |3 |grp01
表table_O:
O_id| id| ref_id
----|---|-------
1 |0 |xxx01
2 |1 |xxx02
3 |2 |xxx03
4 |3 |xxx04
5 |4 |xxx05
6 |5 |xxx06
7 |6 |xxx07
8 |7 |xxx08
表table_P:
|P_id | ref_id | structure| STATUS|group|status_code|
|--------|--------|----------|-------|-----|------------|
1 |xxx01 | X |SUCCESS|grp01| 2|
2 |xxx01 | Y |SUCCESS|grp01| 2|
3 |xxx01 | Z |SUCCESS|grp01| 2|
4 |xxx02 | X |SUCCESS|grp01| 2|
5 |xxx03 | X |SUCCESS|grp01| 2|
6 |xxx03 | Y |FAILURE|grp01| 2|
7 |xxx03 | Z |FAILURE|grp01| 2|
8 |xxx04 | X |SUCCESS|grp01| 2|
8 |xxx04 | Y |SUCCESS|grp01| 2|
8 |xxx04 | Z |SUCCESS|grp01| 2|
8 |xxx06 | X |FAILURE|grp02| 2|
8 |xxx06 | Y |FAILURE|grp02| 2|
8 |xxx06 | Z |FAILURE|grp02| 2|
這應該使您入門。 它並不是一個完整的答案,但評論太久了。
select somefields to be discussed later
, count(distinct id) "Total Records"
from yourTable left join (
select id xid
, status xStatus
from yourTable
where structure = 'X' ) x on xid = yourTableId
)
-- repeat for Y and Z
group by somefields to be discussed later
您實際需要的字段將是滿足您要求的案例構造。 一個例子是:
case when xStatus = 'SUCCESS' and yStatus = 'SUCCESS' and zStatus = 'SUCCESS'
then 'Delivered'
when something else then an appropriate value
else default value end "Stucture Status"
SELECT structure_status, COUNT(DISTINCT id)
FROM (SELECT id,
CASE
-- Case 1
WHEN success_count = 3 THEN 'Success'
-- Case 2
WHEN success_count > 0 AND failure_count = 0 THEN 'Pending'
-- Case 3 - also called 'Pending'?
WHEN total_count = 3 AND failure_count > 0 THEN 'Pending'
-- Case 4 - what to do here?
ELSE 'XXX'
END structure_status
FROM (SELECT m.id,
count(*) total_count,
count(CASE status WHEN 'SUCCESS' THEN 1 END) success_count,
count(CASE status WHEN 'FAILURE' THEN 1 END) failure_count
FROM table_M m
JOIN table_O o ON o.id = m.id
JOIN table_P p ON ofenIdent.ref_id = p.ref_id
WHERE m.group = 'grp01'
AND p.status_flag = 'process'
AND p.structure IN ('X','Y','Z')
GROUP BY m.id) status_count
) structure_status_mapping
GROUP BY structure_status
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.