我需要一些幫助COALESCE。動態傳遞列凝聚
語法:COALESCE(Col1,Col2,Col3...)
這意味着每一次我將不得不寫裏面列名作爲參數的時間。
我的問題是我們可以動態傳遞的列名這個功能呢?因爲列中的列數不斷變化。
感謝, 希德
我需要一些幫助COALESCE。動態傳遞列凝聚
語法:COALESCE(Col1,Col2,Col3...)
這意味着每一次我將不得不寫裏面列名作爲參數的時間。
我的問題是我們可以動態傳遞的列名這個功能呢?因爲列中的列數不斷變化。
感謝, 希德
銥聽起來像是你有一堆列,並且要值到左側,NULL
s移動到右側。
您可以通過每個值前計數的非NULL值的數目,然後使用case
語句來賦值做到這一點。以下顯示了四列的代碼:
select (case when col1_n = 1 then col1
when col2_n = 1 then col2
when col3_n = 1 then col3
when col4_n = 1 then col4
end) as col1,
(case when col2_n = 2 then col2
when col3_n = 2 then col3
when col4_n = 2 then col4
end) as col2,
(case when col3_n = 3 then col3
when col4_n = 3 then col4
end) as col3,
(case when col4_n = 4 then col4
end) as col4
from (select t.*,
(case when col1 is not null then 1 end) as col1_n,
((case when col1 is not not null then 1 else 0 end) +
(case when col2 is not null then 1 end)
) as col2_n,
((case when col1 is not not null then 1 else 0 end) +
(case when col2 is not null then 1 else 0 end) +
(case when col3 is not null then 1 end)
) as col3_n,
((case when col1 is not not null then 1 else 0 end) +
(case when col2 is not null then 1 else 0 end) +
(case when col3 is not null then 1 else 0 end) +
(case when col4 is not null then 1 end)
) as col4_n
from t
) t;
您可以在SQL小提琴(here)上看到此作品。
如果您有一個獨特的id
for each,您還可以取消轉發數據,使用row_number()
並重新傳輸數據。
謝謝Gordon的回覆。似乎上面的代碼是爲了知道(固定)的列數?我的表格中的列數不斷變化。你能告訴我,如果我可以動態地將列傳遞給COALESCE嗎? – user3209759
@ user3209759。 。 。一個表具有固定數量的列,即SQL定義。這聽起來像你可能需要動態SQL或者重新設計的應用程序。從表中添加和刪除列的應用程序聽起來像一個糟糕的設計。 –
我的表格最多有20列。其中可以說我有10列的數據,剩餘的單元將被替換爲NULL。我想我將不得不在硬編碼col1到col20在COALESCE而不是傳遞非NULL的列。我也會看到你所建議的動態SQL選項。謝謝... – user3209759
您的設計聽起來可能沒有正常化。如果列數不斷變化,並且列代表足夠類似的東西,那麼您可以使用'COALESCE'。 Col1,Col2,Col3等代表什麼? –
嗨馬丁 - 每列包含父子元數據,但以不齊整的層次結構(樓梯)格式。由於其中有單元格爲NULL,所以我試圖向左移動數據並填充空單元格。現在由於層次結構的變化,我可能每次都有不同數量的列。 – user3209759
請提供您的數據和期望結果的樣本。 –