2013-01-11 24 views
1

我的SQL語句列表如下:顯示SQL數據從行到列

SELECT Count(DISTINCT A.LM_PERSON_ID) AS HEAD_COUNT 
,A.LM_STATUS 
,To_Char(A.LM_STATUS_CHANGE_DT,'YYYY') AS YEAR 
,B.LM_COURSE_NAME AS COURSE_NAME 

FROM LM_ENRLOLMENT A 
,LM_COURSE_TBL B 

WHERE A.LM_STATUS='COMP' 
AND A.LM_COURSE_ID=B.LM_CI_ID     

GROUP BY A.LM_STATUS_CHANGE_DT,LM_STATUS,B.LM_COURSE_NAME 

的例子輸出我想顯示爲:

COURSE_NAME  2010  2011  2012 
    A    4   5  1 
    B    2   1  1 
    C    6   0  3 
    D    1   1  2 

但我現在面臨的主要問題是該LM_STATUS_CHANGE_DT是動態數據。有沒有人能告訴我我該怎麼做?

+1

如果您使用的是SQL Server(其中RDBMS?),那麼PIVOT命令將爲您執行此操作。 – DWright

+0

否則,如果你在說,Mysql,這個步驟如何:http://stackoverflow.com/questions/7674786/mysql-pivot-table。 – DWright

+0

@DWright你好,很高興認識你。我正在使用oracle SQL沒有Mysql。我會嘗試使用透視功能。以後反饋給你。順便說一句,我不可能通過使用LISTAGG函數來完成這項工作嗎? – goh6319

回答

2

您沒有指定您所使用的RDBMS,但你應該能夠使用所有版本如下:

SELECT 
    B.LM_COURSE_NAME AS COURSE_NAME, 
    count(DISTINCT case when To_Char(A.LM_STATUS_CHANGE_DT,'YYYY') = '2010' then A.LM_PERSON_ID end) as Year2010, 
    count(DISTINCT case when To_Char(A.LM_STATUS_CHANGE_DT,'YYYY') = '2011' then A.LM_PERSON_ID end) as Year2011, 
    count(DISTINCT case when To_Char(A.LM_STATUS_CHANGE_DT,'YYYY') = '2012' then A.LM_PERSON_ID end) as Year2012 
FROM LM_ENRLOLMENT A 
INNER JOIN LM_COURSE_TBL B 
    ON A.LM_COURSE_ID=B.LM_CI_ID 
WHERE A.LM_STATUS='COMP' 
GROUP BY B.LM_COURSE_NAME 

如果您使用的是具有PIVOT功能(SQL Server 2005中的RDBMS +/Oracle 11g +),那麼您的代碼將與此類似:

SELECT * 
FROM 
(
    SELECT DISTINCT B.LM_COURSE_NAME, 
    To_Char(A.LM_STATUS_CHANGE_DT,'YYYY') As Year, 
    A.LM_PERSON_ID 
    FROM LM_ENRLOLMENT A 
    INNER JOIN LM_COURSE_TBL B 
    ON A.LM_COURSE_ID=B.LM_CI_ID 
    WHERE A.LM_STATUS='COMP' 
) src 
PIVOT 
(
    count(LM_PERSON_ID) 
    for Year in ('2010', '2011', '2012') 
) piv 
+0

OP在示例中有不同的計數。您是否必須在解決方案中考慮這一點? – bobs

+0

@bobs是的。我需要解釋我的解決方案中的獨特之處。 – goh6319

+0

修改爲包含'DISTINCT' – Taryn