嘗試此查詢請:
SELECT
MAX(CASE WHEN t.colName = 'C1' THEN t.f ELSE NULL END) AS 'C1',
MAX(CASE WHEN t.colName = 'C2' THEN t.f ELSE NULL END) AS 'C2',
MAX(CASE WHEN t.colName = 'C3' THEN t.f ELSE NULL END) AS 'C3',
MAX(CASE WHEN t.colName = 'C4' THEN t.f ELSE NULL END) AS 'C4'
FROM
(
SELECT c2 AS f,
'C2' AS colName,
@rn2 := @rn2 + 1 row_number
FROM mergetable,(SELECT @rn2 := 0) var
WHERE c2 IS NOT NULL
UNION
SELECT c1,
'C1' AS colName,
@rn1 := @rn1 + 1 row_number
FROM mergetable,(SELECT @rn1 := 0) var
WHERE c1 IS NOT NULL
UNION
SELECT
c4,
'C4' AS colName,
@rn4 := @rn4 + 1 row_number
FROM mergetable,(SELECT @rn4 := 0) var
WHERE c4 IS NOT NULL
UNION
SELECT
c3,
'C3' AS colName,
@rn3 := @rn3 + 1 row_number
FROM mergetable,(SELECT @rn3 := 0) var
WHERE c3 IS NOT NULL
) t
GROUP BY t.row_number;
請檢查DEMO HERE
說明:
考慮在內查詢之一:
這裏有一個:
SELECT c2 AS f,
'C2' AS colName,
@rn2 := @rn2 + 1 row_number
FROM mergetable,(SELECT @rn2 := 0) var
WHERE c2 IS NOT NULL;
輸出爲列C2:
f colName row_number
y C2 1
z C2 2
其實上述各內部查詢的會給出一樣輸出結構:
輸出爲列C1:
f colName row_number
x C1 1
w C1 2
輸出爲列C3:
f colName row_number
p C3 1
Q C3 2
輸出爲列C4:
f colName row_number
A C4 1
B C4 2
C C4 3
現在,如果你UNION
所有這些,你會得到一個輸出結構如下圖所示:
f colName row_number
y C2 1
z C2 2
x C1 1
w C1 2
A C4 1
B C4 2
C C4 3
p C3 1
Q C3 2
看,如果我沒有在每個內部查詢中使用列名稱列,那麼現在就有辦法了知道哪個值屬於哪一列。
現在從上面的最終輸出結構,如果你使用pivoting
那麼你可以很容易地導出預期的輸出。
如果只有1列將被填充,那麼它看起來像不好的設計。您可以添加2列,首先將包含您當前輸入的列名作爲值,第二列將包含該值。 – Spidey
@Nimesh這不是一個設計好的表格,但是從數據透視表查詢生成的輸出在這裏閱讀它比你會理解目的,請參閱http://stratosprovatopoulos.com/web-development/mysql/pivot-a-table-in -mysql/ – geeksal
我知道數據透視表是什麼以及它是如何工作的,你提到了作爲一個表,所以我添加了這個建議。那是你應該提到的輸出,並提供了代碼。順便說一句,你使用'coalesce'在文章的第4步中提到擺脫空值? – Spidey