這是我的第一個問題,請耐心等待,這是我在處理產品資料時遇到的挑戰。以下是我的資料。
| 列_A | 列_B | C欄 | Column_D | 列_E | Column_F |
|---|---|---|---|---|---|
| A1 | 無效的 | C1 | D1 | 無效的 | F1 |
| 無效的 | 無效的 | C2 | 無效的 | E2 | F2 |
| A3 | B3 | 無效的 | D3 | 無效的 | F3 |
| 無效的 | 無效的 | 無效的 | 無效的 | 無效的 | F4 |
我想要實作的目標是讓資料以一種合理且方便的方式格式化,以便前端開發人員將其放在網站上。基本上,只要有 NULL,我就必須將資料移動到其他列中。例如:
- 如果第一、二、五列為 Null 那么第三、四、六列的資料應該分別列印在前三列中
- 如果前 5 列全部為空,則第 6 列資料應列印在第 1 列中,依此類推
預期輸出:
| 列_A | 列_B | C欄 | Column_D | 列_E | Column_F |
|---|---|---|---|---|---|
| A1 | C1 | D1 | F1 | 無效的 | 無效的 |
| C2 | E2 | F2 | 無效的 | 無效的 | 無效的 |
| A3 | B3 | D3 | F3 | 無效的 | 無效的 |
| F4 | 無效的 | 無效的 | 無效的 | 無效的 | 無效的 |
這在 SQL 中是否可行,如果可以,請幫助我解決這個問題。
我應該使用案例陳述還是有更好的方法?
uj5u.com熱心網友回復:
你可以試試這個:
- 逆透視您的資料并保持每列的順序,即 Column_A 順序 1,Column_B 順序 2 等等。
- 將
ROW_NUMBER()函式與列值不為空的非透視資料一起使用以獲得沒有空值的新訂單。 - 使用上一步中定義的行號通過條件聚合對資料進行透視以獲得所需的輸出。
with t as
(
select id, Column_A as col, 1 as ord from table_name
union all
select id, Column_b, 2 from table_name
union all
select id, Column_c, 3 from table_name
union all
select id, Column_d, 4 from table_name
union all
select id, Column_e, 5 from table_name
union all
select id, Column_f, 6 from table_name
),
t2 as
(
select *,
row_number() over (partition by id order by ord) rn
from t where col is not null
)
select id,
max(case when rn =1 then col end) Column_A,
max(case when rn =2 then col end) Column_B,
max(case when rn =3 then col end) Column_C,
max(case when rn =4 then col end) Column_D,
max(case when rn =5 then col end) Column_E,
max(case when rn =6 then col end) Column_F
from t2
group by id
order by id
看一個演示。
uj5u.com熱心網友回復:
以下查詢將完全按照您描述的邏輯一步一步地執行并產生完全正確的結果。也會有其他方法,我只是玩玩玩玩;)
SELECT
columnA,
CASE WHEN columnA = columnB THEN NULL
ELSE columnB END AS columnB,
CASE WHEN columnC IN (columnA,columnB) THEN NULL
ELSE columnC END AS columnC,
CASE WHEN columnD IN (columnA,columnB,columnC) THEN NULL
ELSE columnD END AS columnD,
CASE WHEN columnE IN (columnA,columnB,columnC,columnD) THEN NULL
ELSE columnE END AS columnE,
CASE WHEN columnF IN (columnA,columnB,columnC,columnD,columnE) THEN NULL
ELSE columnF END AS columnF
FROM
(SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(sub,',',1 ), ',', -1) AS columnA,
SUBSTRING_INDEX(SUBSTRING_INDEX(sub,',',2 ), ',', -1) AS columnB,
SUBSTRING_INDEX(SUBSTRING_INDEX(sub,',',3 ), ',', -1) AS columnC,
SUBSTRING_INDEX(SUBSTRING_INDEX(sub,',',4 ), ',', -1) AS columnD,
SUBSTRING_INDEX(SUBSTRING_INDEX(sub,',',5 ), ',', -1) AS columnE,
SUBSTRING_INDEX(SUBSTRING_INDEX(sub,',',6 ), ',', -1) AS columnF
FROM
(SELECT
CONCAT(
CASE WHEN columnA IS NULL THEN '' ELSE CONCAT(columnA,',') END,
CASE WHEN columnB IS NULL THEN '' ELSE CONCAT(columnB,',') END,
CASE WHEN columnC IS NULL THEN '' ELSE CONCAT(columnC,',') END,
CASE WHEN columnD IS NULL THEN '' ELSE CONCAT(columnD,',') END,
CASE WHEN columnE IS NULL THEN '' ELSE CONCAT(columnE,',') END,
CASE WHEN columnF IS NULL THEN '' ELSE columnF END)
AS sub
FROM yourtable) x)y;
看到這里結果是正確的:db<>fiddle
旁注:此查詢的線索是 - 除了令人興奮的語法 - 例如,如果將輸入值從 F3 更改為 D3,結果第三行中的 columnD 的值將為空。您沒有告訴我們這是否有意為之,但我喜歡這個功能。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/533978.html
標籤:数据库数据库案子
