2017-01-29 9 views
0

我已經在MySQL下表換位MySQL的行與數據定製列

emp_id   month   salary 
1    Jan    2000 
1    Feb    2000 
1    March   2000 
2    Jan    3000 
2    Feb    3000 
2    March   3000 

我試圖得到一個結果類似以下內容:

emp_id Jan_sal feb_sal  Mar_sal 
1   2000 2000  2000 
2   3000 3000  3000 

我的查詢:

select emp_id, 
(case when month = 'Jan' then salary else NUll end) jan_sal, 
(case when month = 'Feb' then salary else NUll end) feb_sal, 
(case when month = 'March' then salary else NUll end) march_sal 
from emp group by emp_id; 

但我得到的輸出爲:

emp_id jan_sal feb_sal march_sal 
1  2000  NULL NULL 
2  3000  NULL NULL 

不知道我的查詢是否正確。 任何幫助表示讚賞。

+0

總和(),MAX()等 - 但我會處理在表示層 – Strawberry

回答

1

使用MAX()功能透視:

SELECT emp_id, 
     MAX(CASE WHEN month = 'Jan' THEN salary END) AS jan_sal, 
     MAX(CASE WHEN month = 'Feb' THEN salary END) AS feb_sal, 
     MAX(CASE WHEN month = 'March' THEN salary END) AS march_sal 
FROM emp 
GROUP BY emp_id; 

這假定每個員工只有每月一份薪水條目。如果可能有多個條目,則應使用原始CASE表達式與SUM()而不是MAX()

+0

感謝蒂姆顯示邏輯, 它不給我正確的結果,但是從概念點我不明白爲什麼我們需要max()和sum()聚合函數。例如:Id 1獲得2000作爲薪水,那麼爲什麼我們要做個max()的案例month ='jan'? – A8H1

+0

對於每組員工記錄,您需要選擇一個您想要的。例如,第一個「CASE」表達式將從1月份爲該員工記錄1月份的薪水,而在其他地方則爲NULL。 'MAX()'函數將會_ignore_'NULL'值,即忽略你不想要的記錄。 –

+0

哦!因此,如果1月份的同一個ID的另一個值小於2000,那麼它將與Null一起被忽略。我懂了。這有助於。謝謝。 – A8H1

1

您想使用聚合函數就像case語句

select emp_id, 
sum(case when month = 'Jan' then salary else NUll end) jan_sal, 
sum(case when month = 'Feb' then salary else NUll end) feb_sal, 
sum(case when month = 'March' then salary else NUll end) march_sal 
from emp 
group by emp_id; 

如果有多個工資存在SUMMAX(可能是其他福利等)對同一員工,那麼你必須決定是否要要添加所有薪水或只取最大值並根據該值使用SUM或MAX。