我有這樣的表:
| ID | 產品 |
|---|---|
| 1 | 蘋果 |
| 2 | 三星 |
| 2 | 蘋果 |
| 3 | 華為 |
| 4 | 夏沫 |
| 4 | 蘋果 |
產品分為ios和android兩種。我想得到一張這樣的表:
| ID | IOS | 安卓 |
|---|---|---|
| 1 | 是的 | 不 |
| 2 | 是的 | 是的 |
| 3 | 不 | 是的 |
| 4 | 是的 | 是的 |
我試過 :
select id,
case when product = 'APPLE' THEN 'YES' ELSE 'NO' END as 'IOS',
case when product in ('SUMSUNG', 'HUAWEI', 'XIAMO') THEN 'YES' ELSE 'NO' END AS 'ANDROID'
from table
但我得到了這張桌子:
| ID | IOS | 安卓 |
|---|---|---|
| 1 | 是的 | 不 |
| 2 | 是的 | 不 |
| 2 | 不 | 是的 |
| 3 | 不 | 是的 |
| 4 | 是的 | 不 |
| 4 | 不 | 是的 |
uj5u.com熱心網友回復:
您還需要另一個 - mapping- 表來顯示哪個作業系統屬于哪個產品。是的,您可以將其硬編碼到查詢中,但這通常是個壞主意。每次新產品上市時,您都不能修改查詢,對嗎?你當然可以,但你不應該。
SQL> with mapping (product, os) as
2 (select 'APPLE' , 'IOS' from dual union all
3 select 'SAMSUNG', 'ANDROID' from dual union all
4 select 'HUAWEI' , 'ANDROID' from dual union all
5 select 'XIAMO' , 'ANDROID' from dual
6 ),
7 your_table (id, product) as
8 (select 1, 'APPLE' from dual union all
9 select 2, 'SAMSUNG' from dual union all
10 select 2, 'APPLE' from dual union all
11 select 3, 'HUAWEI' from dual union all
12 select 4, 'XIAMO' from dual union all
13 select 4, 'APPLE' from dual
14 )
15 select y.id,
16 max(case when p.os = 'IOS' then 'YES' else 'NO' end) as ios,
17 max(case when p.os = 'ANDROID' then 'YES' else 'NO' end) as android
18 from your_table y join mapping p on p.product = y.product
19 group by y.id
20 order by y.id;
ID IOS AND
---------- --- ---
1 YES NO
2 YES YES
3 NO YES
4 YES YES
SQL>
uj5u.com熱心網友回復:
您可以聚合以確保 id 只出現一次:
select id,
MAX(case when product = 'APPLE' THEN 'YES' END) as 'IOS',
MAX(case when product in ('SUMSUNG', 'HUAWEI', 'XIAMO') THEN 'YES' END) AS 'ANDROID'
from table
GROUP BY id
這確保您每個 id 獲得一行 - 但您獲得的是 NULL 而不是“NO”。要解決該問題,請使用 COALESCE。
select id,
COALESCE(MAX(case when product = 'APPLE' THEN 'YES' END),'NO') as 'IOS',
COALESCE(MAX(case when product in ('SUMSUNG', 'HUAWEI', 'XIAMO') THEN 'YES' END),'NO') AS 'ANDROID'
from table
GROUP BY id
uj5u.com熱心網友回復:
您可以根據品牌構建邏輯APPLE,因為這是APPLE其自己的作業系統(IOS)的唯一成員(),例如
SELECT id,
DECODE(SIGN(SUM(DECODE(product,'APPLE',1,0))),1,'YES','NO') AS ios,
DECODE(SIGN(SUM(DECODE(product,'APPLE',0,1))),1,'YES','NO') AS android
FROM t
GROUP BY id
ORDER BY id
其中具有沿內條件句SUM()通過分組聚集id列和符號函式檢查存在/ unexistence的APPLE由二進制數字,然后用詞語替換它們YES/NO
Demo
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/336031.html
