2012-12-20 284 views
1

我有一个问题,我希望在单个列中查找语句,并且每次找到它们时都会在混合中插入一个新列。我使用MySQL数据库。插入带有case语句的列

例如说我有这样的

Class  Sub 
    ----------------- 
    1  math  
    1  tech 
    2  math 
    2  english 
    3  math 

数据,我想数据是这样的输出:

Class math tech english 
--------------------------- 
    1  Y  Y  N 
    2  Y  N  Y 
    3  Y  N  N 

我试图用CASE语句来查找值列,但问题是它只会返回列中找到的值的一个结果,并且最终我得到的每个列的case语句都重复使用同一个类。结合案例陈述不会工作,因为那仍然给我一个专栏。

回答

4

您需要将CASE表达式汇总并添加GROUP BY。在这种情况下MAX将作为字母Y来后N

(SQL Fiddle Demo)

SELECT class, 
     MAX(CASE 
      WHEN (community_id = 'Math') THEN 'Y' 
      ELSE 'N' 
      END) AS Math, 
     MAX (CASE 
       WHEN (community_id = 'tech') THEN 'Y' 
       ELSE 'N' 
      END) AS tech, 
     MAX (CASE 
       WHEN (community_id = 'english') THEN 'Y' 
       ELSE 'N' 
      END) AS english 
FROM x_class_community 
GROUP BY class 
+0

使用max函数和group by不能解决问题,对于每个单独的类我都需要所有的va代表所有的代表。在我的情况下,当我按功能做组时,我失去了重复,这很好,但是这些值并没有在单个类中表示出来。 – mmSQL

+0

@mmSQL - 这将返回您希望从示例数据中获得的结果([请参阅SQL小提琴链接](http://www.sqlfiddle.com/#!3/186ec/10))。你是说你真的想要不同的东西吗? –

+0

没关系,我明白了!我有一个小错字。 – mmSQL

0

您需要使用PIVOT功能。您还没有指定您的DBMS,但是这里是一个链接的SQL Server:Using PIVOT and UNPIVOT

0

如果您正在使用SQL Server,那么你可以使用PIVOT功能:

select class, 
    isnull(math, 'N') math, 
    isnull(tech, 'N') tech, 
    isnull(english, 'N') english 
from 
(
    SELECT class, community_id, 'Y' as flag 
    FROM x_class_community 
) src 
pivot 
(
    max(flag) 
    for community_id in (math, tech, english) 
) piv 

SQL Fiddle with Demo

的结果是:

| CLASS | MATH | TECH | ENGLISH | 
--------------------------------- 
|  1 | Y | Y |  N | 
|  2 | Y | N |  Y | 
|  3 | Y | N |  N |