2013-01-13 22 views
0

任何人都可以幫助我處理將列轉換爲行然後相應地查找數據的查詢。從列表中獲取數據並將列作爲MYSQL中的行

問題在下面。我已經嘗試了一個查詢,將列名獲取到行中,但是我無法獲取值或者有任何想法找出列3和列4的位置。我是SQL中的一個新的布爾。有人可以幫我從這裏出去嗎。我從朋友那裏聽到提示支點,當我瀏覽我發現在MYSQL

Input Table: 

E1   E2   E3   E4   E5   E6 

Null   1234   234   12   A   B 
123   Null   Null   Null   12   B 
Null   Null   Null   Null   Null   Null 
123   2   1   A   1   2 


Output Table: 

C1   C2   Count   TotalC   percent   

E1   123   2    2    1 
E2   1234   1    2    0.5 
E2   2   1    2    0.5 
E3   234   1    2    0.5 
E3   1   1    2    0.5 
E4   12   1    2    0.5 
E4   A   1    2    0.5 
E5   A   1    3    0.3 
E5   12   1    3    0.3 
E5   1   1    3    0.3 
E6   B   2    3    0.6 
E6   2   1    3    0.3 

的問題的解釋不支持PIVOT:

  1. C1是輸入表的列名。
  2. C2是這些列中的數據。
  3. 計數是每列中類似項目和單數的數量。
  4. TotalC是總非空值的數量。
  5. %是count/totalc。

查詢我的工作:SELECT (COLUMN_NAME)AS Column1 FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'inputtable';

注:查詢MYSQL中。

+0

*爲什麼*你想要做到這一點?你能提供更多的上下文嗎?機會可能是這個任務在數據庫層之外更好地執行,或者你最好使用不同的模式。 – eggyal

+0

@eggyal:生病得到一個包含該樣本數據的文件作爲輸入,我必須運行查詢才能使數據在另一個表中保留。我可以通過「數據庫層以外」瞭解你的意思嗎? –

+0

「*在數據庫層以外*」,我的意思是在您的應用程序代碼中執行此數據操作,而不是在SQL中。 – eggyal

回答

0

正如我在上面的評論中所提到的,您應該以不同的方式處理這個問題。見What is the XY problem?

但是,如果必須,可以解決使用UNION這個問題:

SELECT *, Count/TotalC AS percent 
FROM (
    SELECT 'E1' AS C1, E1 AS C2, COUNT(*) AS Count 
    FROM  Input 
    WHERE E1 IS NOT NULL 
    GROUP BY C2 
UNION ALL 
    SELECT 'E2' AS C1, E2 AS C2, COUNT(*) AS Count 
    FROM  Input 
    WHERE E2 IS NOT NULL 
    GROUP BY C2 
UNION ALL 
    SELECT 'E3' AS C1, E3 AS C2, COUNT(*) AS Count 
    FROM  Input 
    WHERE E3 IS NOT NULL 
    GROUP BY C2 
UNION ALL 
    SELECT 'E4' AS C1, E4 AS C2, COUNT(*) AS Count 
    FROM  Input 
    WHERE E4 IS NOT NULL 
    GROUP BY C2 
UNION ALL 
    SELECT 'E5' AS C1, E5 AS C2, COUNT(*) AS Count 
    FROM  Input 
    WHERE E5 IS NOT NULL 
    GROUP BY C2 
UNION ALL 
    SELECT 'E6' AS C1, E6 AS C2, COUNT(*) AS Count 
    FROM  Input 
    WHERE E6 IS NOT NULL 
    GROUP BY C2 
) t1 NATURAL JOIN (
    SELECT 'E1' AS C1, COUNT(E1) AS TotalC FROM Input 
UNION ALL 
    SELECT 'E2' AS C1, COUNT(E2) AS TotalC FROM Input 
UNION ALL 
    SELECT 'E3' AS C1, COUNT(E3) AS TotalC FROM Input 
UNION ALL 
    SELECT 'E4' AS C1, COUNT(E4) AS TotalC FROM Input 
UNION ALL 
    SELECT 'E5' AS C1, COUNT(E5) AS TotalC FROM Input 
UNION ALL 
    SELECT 'E6' AS C1, COUNT(E6) AS TotalC FROM Input 
) t2 

看到它的sqlfiddle

+0

真棒,這真的幫助我。謝謝 –

+0

我正在努力使其動態。有什麼方法可以讓E1,E2,E3 ................................成爲動態的。 –

+0

@AnveshVejandla:['INFORMATION_SCHEMA.COLUMNS'](http://dev.mysql.com/doc/en/columns-table.html)? – eggyal

相關問題