2013-01-13 25 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

相关问题