2017-10-17 39 views
2

我現在有以下SQL查詢:內連接與樞軸條件SQL

SELECT 
    name, 
    SUM(IF(MONTH(date) = 1, amount, 0)) AS jan, 
    SUM(IF(MONTH(date) = 2, amount, 0)) AS feb, 
    SUM(IF(MONTH(date) = 3, amount, 0)) AS mar, 
    SUM(IF(MONTH(date) = 4, amount, 0)) AS apr, 
    SUM(IF(MONTH(date) = 5, amount, 0)) AS mei, 
    SUM(IF(MONTH(date) = 6, amount, 0)) AS jun, 
    SUM(IF(MONTH(date) = 7, amount, 0)) AS jul, 
    SUM(IF(MONTH(date) = 8, amount, 0)) AS agu, 
    SUM(IF(MONTH(date) = 9, amount, 0)) AS sep, 
    SUM(IF(MONTH(date) = 10, amount, 0)) AS okt, 
    SUM(IF(MONTH(date) = 11, amount, 0)) AS nov, 
    SUM(IF(MONTH(date) = 12, amount, 0)) AS des, 
    SUM(amount) AS total 
FROM iuran_detail 
WHERE (
    date BETWEEN '$date_first' AND '$date_last' 
) GROUP BY name; 

我想和2代表的SQL,用戶表(與組一起)和量修改。

enter image description here

我想內連接或另一種方式,結合起來,得到以下結果(由A組EG):

enter image description here

感謝

回答

1

注意:如果加盟表中,最好的做法是將EVERY列引用與源表名稱或源表的別名(我使用後者)進行匹配。 「date」是一個可怕的列名稱,因爲它也是由SQL本身使用並可能導致混淆,所以下面我已經使用MySQL反引號來引用該列,在SQL-Server中,您可以使用[date]來代替。

 
SELECT 
    u.name, 
    SUM(IF(MONTH(`date`) = 1, d.amount, 0)) AS jan, 
    SUM(IF(MONTH(`date`) = 2, d.amount, 0)) AS feb, 
    SUM(IF(MONTH(`date`) = 3, d.amount, 0)) AS mar, 
    SUM(IF(MONTH(`date`) = 4, d.amount, 0)) AS apr, 
    SUM(IF(MONTH(`date`) = 5, d.amount, 0)) AS mei, 
    SUM(IF(MONTH(`date`) = 6, d.amount, 0)) AS jun, 
    SUM(IF(MONTH(`date`) = 7, d.amount, 0)) AS jul, 
    SUM(IF(MONTH(`date`) = 8, d.amount, 0)) AS agu, 
    SUM(IF(MONTH(`date`) = 9, d.amount, 0)) AS sep, 
    SUM(IF(MONTH(`date`) = 10, d.amount, 0)) AS okt, 
    SUM(IF(MONTH(`date`) = 11, d.amount, 0)) AS nov, 
    SUM(IF(MONTH(`date`) = 12, d.amount, 0)) AS des, 
    SUM(d.amount) AS total 
FROM table_trx d 
INNER JOIN table_user u on d.user_id = u.id 
WHERE (
    d.`date` BETWEEN '$`date`_first' AND '$`date`_last' 
) GROUP BY u.name; 

我個人不喜歡使用IF()作爲替代的更標準的CASE表達式因爲它是在SQL數據庫中更廣泛地支持。

 
SELECT 
    u.name, 
    SUM(case when MONTH(`date`) = 1 then d.amount else 0 end) AS jan, 
    SUM(case when MONTH(`date`) = 2 then d.amount else 0 end) AS feb, 
    SUM(case when MONTH(`date`) = 3 then d.amount else 0 end) AS mar, 
    SUM(case when MONTH(`date`) = 4 then d.amount else 0 end) AS apr, 
    SUM(case when MONTH(`date`) = 5 then d.amount else 0 end) AS mei, 
    SUM(case when MONTH(`date`) = 6 then d.amount else 0 end) AS jun, 
    SUM(case when MONTH(`date`) = 7 then d.amount else 0 end) AS jul, 
    SUM(case when MONTH(`date`) = 8 then d.amount else 0 end) AS agu, 
    SUM(case when MONTH(`date`) = 9 then d.amount else 0 end) AS sep, 
    SUM(case when MONTH(`date`) = 10 then d.amount else 0 end) AS okt, 
    SUM(case when MONTH(`date`) = 11 then d.amount else 0 end) AS nov, 
    SUM(case when MONTH(`date`) = 12 then d.amount else 0 end) AS des, 
    SUM(d.amount) AS total 
FROM table_trx d 
INNER JOIN table_user u on d.user_id = u.id 
WHERE (
    d.`date` BETWEEN '$`date`_first' AND '$`date`_last' 
) GROUP BY u.name;