2012-12-20 1046 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 |