CREATE TABLE test_tab (
e_id NUMBER(10),
sys_name VARCHAR2(20),
ref_id NUMBER(10),
sys_other VARCHAR2(20)
);
INSERT INTO test_tab VALUES(805,'SRC',NULL,'Email');
INSERT INTO test_tab VALUES(805,'SRC',NULL,'Test');
INSERT INTO test_tab VALUES(805,'TGT',NULL,null);
INSERT INTO test_tab VALUES(805,'TGT',128,'Email');
INSERT INTO test_tab VALUES(6122,'SRC',NULL,'Email');
INSERT INTO test_tab VALUES(6122,'TGT',NULL,'Email');
INSERT INTO test_tab VALUES(122,'SRC',128,null);
INSERT INTO test_tab VALUES(122,'TGT',128,null);
COMMIT;
Tool used: Oracle Developer(18c)
我想創建一個報告,其中我只需要包含那些e_id不ref_id為 null 且sys_other為Email or null. 除此組合外,e_id報告中將不考慮該組合。例如:
e_id = 122它應該出現在報告中,因為ref_id它不為空且sys_other為空
e_id = 6122ref_id它不應該像null一樣出現在報告中
e_id = 805它也不應該出現在ref_id不為空的報告中,但在sys_other我們的值Email and null中Test,我們應該排除這個 e_id
邏輯:基本上,需要檢查兩列ref_id和sys_other。如果 ref_id 為空,那么我們應該排除那些 e_id,如果它不為空,則需要檢查 sys_other 列,如果它有“電子郵件”而不是包含,否則不考慮列 sys_name
我的嘗試:
SELECT e_id,ref_id,sys_other
FROM test_tab
WHERE ref_id IS NOT NULL
AND (sys_other = 'Email' OR sys_other IS NULL)
GROUP BY e_id,ref_id,sys_other;
但是上面的查詢給了我 805 id 應該被排除在外。
預期輸出:
------ -------- -----------
| E_ID | REF_ID | SYS_OTHER |
------ -------- -----------
| 122 | 128 | null |
------ -------- -----------
uj5u.com熱心網友回復:
你可以試試:
SELECT e_id,
MAX(ref_id) AS ref_id,
MAX(sys_other) AS sys_other
FROM test_tab
GROUP BY e_id
HAVING COUNT(ref_id) > 0
AND COUNT(CASE WHEN sys_other <> 'Email' THEN 1 END) = 0;
將按e_id每個組分組:
- 計算非空值
ref_id并確保至少有 1 行和 - 計算非空
sya_other值,Email并確保組中沒有非空、非電子郵件行。
uj5u.com熱心網友回復:
您可以根據 Logic 中所述的條件排除 e_id:
WITH
exclude AS
(
SELECT
E_ID,
SYS_OTHER
FROM
TEST_TAB
WHERE
SYS_OTHER Is Not Null And SYS_OTHER <> 'Email'
GROUP BY
E_ID,
SYS_OTHER
)
SELECT
e_id,
ref_id,
sys_other
FROM
test_tab
WHERE
E_ID Not IN(SELECT E_ID FROM exclude) And
ref_id IS NOT NULL AND
Nvl(sys_other, 'Email') = 'Email'
GROUP BY
e_id,
ref_id,
sys_other;
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/491957.html
下一篇:使用sql加入重疊時間?
