2016-04-05 66 views
1
基於非空值的最大行數

考慮下面的MySQL表如何合併在MySQL

牛逼

c1 c2 c3 c4 
------------------- 
X NULL NULL NULL 
w NULL NULL NULL 
NULL y NULL NULL 
NULL Z NULL NULL 
NULL NULL P NULL 
NULL NULL NULL A 
NULL NULL Q NULL 
NULL NULL NULL B 
NULL NULL NULL C 

現在我想這樣

c1 c2 c3 c4 
------------------- 
x Y P A 
w z Q B 
NULL NULL NULL C 

輸出您可以看到,輸出是基於列的非空值的最大數量顯示的。

任何人都可以幫助我如何實現這個使用MySQL。

UPDATE

只有行中的一個列值將始終不空,其餘三列的將永遠是零。

+0

如果只有1列將被填充,那麼它看起來像不好的設計。您可以添加2列,首先將包含您當前輸入的列名作爲值,第二列將包含該值。 – Spidey

+0

@Nimesh這不是一個設計好的表格,但是從數據透視表查詢生成的輸出在這裏閱讀它比你會理解目的,請參閱http://stratosprovatopoulos.com/web-development/mysql/pivot-a-table-in -mysql/ – geeksal

+0

我知道數據透視表是什麼以及它是如何工作的,你提到了作爲一個表,所以我添加了這個建議。那是你應該提到的輸出,並提供了代碼。順便說一句,你使用'coalesce'在文章的第4步中提到擺脫空值? – Spidey

回答

1

嘗試此查詢請:

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那麼你可以很容易地導出預期的輸出。

+0

您的CODE似乎正常工作只是解釋我下面的代碼做了什麼SELECT c2 AS f, 'C2'as colName, @ rn2:= @ rn2 + 1 row_number FROM mergetable,(SELECT @ rn2:= 0 )var WHERE c2 IS NOT NULL' 我還是新來推進sql – geeksal

+0

請檢查現在。我已經添加了解釋。 @geeksal – 1000111

+0

謝謝我理解它的一些部分,但我會建議一個更清晰的解釋或一些教程鏈接相同。任何方式接受你的答案,但仍試圖學習這個概念。 :) – geeksal