2017-03-08 138 views
2

我有一个表的工作具有以下结构GROUP BY与CASE语句

================================================ 
| userID | jobDate | cityID | totalCost | 
================================================ 
| 1234 | 2016-04-01 | 1  |  200 | 
| 1234 | 2016-04-21 | 1  |  800 | 
| 1234 | 2016-08-03 | 1  |  2000 | 
| 1234 | 2016-12-01 | 1  |  300 | 
| 1234 | 2017-02-01 | 1  |  500 | 
================================================ 

我想一个月调换成列。

预期输出:

======================================================== 
| userID | April 2016 | May 2016 | .... | January 2017 | 
======================================================== 
| 1234 | 1000 | 0  | .... |  500  | 
======================================================== 

我的查询:

SELECT u.userID, u.userFullName, ci.cityName, 
    CASE 
     WHEN CONCAT(MONTHNAME(j.jobDate), ' ', YEAR(j.jobDate)) = 'April 2016' THEN GROUP_CONCAT(CONCAT(c.categoryName, ' ', s.supercategoryName)) 
     ELSE '-' 
    END AS 'April 2016 Services', 
    CASE 
     WHEN CONCAT(MONTHNAME(j.jobDate), ' ', YEAR(j.jobDate)) = 'April 2016' THEN SUM(j.totalCost + j.discountReceived) 
     ELSE 0 
    END AS 'April 2016 Spends', 

    CASE 
     WHEN CONCAT(MONTHNAME(j.jobDate), ' ', YEAR(j.jobDate)) = 'May 2016' THEN GROUP_CONCAT(CONCAT(c.categoryName, ' ', s.supercategoryName)) 
     ELSE '-' 
    END AS 'May 2016 Services', 
    CASE 
     WHEN CONCAT(MONTHNAME(j.jobDate), ' ', YEAR(j.jobDate)) = 'May 2016' THEN SUM(j.totalCost + j.discountReceived) 
     ELSE 0 
    END AS 'May 2016 Spends', 

    CASE 
     WHEN CONCAT(MONTHNAME(j.jobDate), ' ', YEAR(j.jobDate)) = 'June 2016' THEN GROUP_CONCAT(CONCAT(c.categoryName, ' ', s.supercategoryName)) 
     ELSE '-' 
    END AS 'June 2016 Services', 
    CASE 
     WHEN CONCAT(MONTHNAME(j.jobDate), ' ', YEAR(j.jobDate)) = 'June 2016' THEN SUM(j.totalCost + j.discountReceived) 
     ELSE 0 
    END AS 'June 2016 Spends', 

    CASE 
     WHEN CONCAT(MONTHNAME(j.jobDate), ' ', YEAR(j.jobDate)) = 'July 2016' THEN GROUP_CONCAT(CONCAT(c.categoryName, ' ', s.supercategoryName)) 
     ELSE '-' 
    END AS 'July 2016 Services', 
    CASE 
     WHEN CONCAT(MONTHNAME(j.jobDate), ' ', YEAR(j.jobDate)) = 'July 2016' THEN SUM(j.totalCost + j.discountReceived) 
     ELSE 0 
    END AS 'July 2016 Spends', 

    CASE 
     WHEN CONCAT(MONTHNAME(j.jobDate), ' ', YEAR(j.jobDate)) = 'August 2016' THEN GROUP_CONCAT(CONCAT(c.categoryName, ' ', s.supercategoryName)) 
     ELSE '-' 
    END AS 'August 2016 Services', 
    CASE 
     WHEN CONCAT(MONTHNAME(j.jobDate), ' ', YEAR(j.jobDate)) = 'August 2016' THEN SUM(j.totalCost + j.discountReceived) 
     ELSE 0 
    END AS 'August 2016 Spends', 

    CASE 
     WHEN CONCAT(MONTHNAME(j.jobDate), ' ', YEAR(j.jobDate)) = 'September 2016' THEN GROUP_CONCAT(CONCAT(c.categoryName, ' ', s.supercategoryName)) 
     ELSE '-' 
    END AS 'September 2016 Services', 
    CASE 
     WHEN CONCAT(MONTHNAME(j.jobDate), ' ', YEAR(j.jobDate)) = 'September 2016' THEN SUM(j.totalCost + j.discountReceived) 
     ELSE 0 
    END AS 'September 2016 Spends', 

    CASE 
     WHEN CONCAT(MONTHNAME(j.jobDate), ' ', YEAR(j.jobDate)) = 'October 2016' THEN GROUP_CONCAT(CONCAT(c.categoryName, ' ', s.supercategoryName)) 
     ELSE '-' 
    END AS 'October 2016 Services', 
    CASE 
     WHEN CONCAT(MONTHNAME(j.jobDate), ' ', YEAR(j.jobDate)) = 'October 2016' THEN SUM(j.totalCost + j.discountReceived) 
     ELSE 0 
    END AS 'October 2016 Spends', 

    CASE 
     WHEN CONCAT(MONTHNAME(j.jobDate), ' ', YEAR(j.jobDate)) = 'November 2016' THEN GROUP_CONCAT(CONCAT(c.categoryName, ' ', s.supercategoryName)) 
     ELSE '-' 
    END AS 'November 2016 Services', 
    CASE 
     WHEN CONCAT(MONTHNAME(j.jobDate), ' ', YEAR(j.jobDate)) = 'November 2016' THEN SUM(j.totalCost + j.discountReceived) 
     ELSE 0 
    END AS 'November 2016 Spends', 

    CASE 
     WHEN CONCAT(MONTHNAME(j.jobDate), ' ', YEAR(j.jobDate)) = 'December 2016' THEN GROUP_CONCAT(CONCAT(c.categoryName, ' ', s.supercategoryName)) 
     ELSE '-' 
    END AS 'December 2016 Services', 
    CASE 
     WHEN CONCAT(MONTHNAME(j.jobDate), ' ', YEAR(j.jobDate)) = 'December 2016' THEN SUM(j.totalCost + j.discountReceived) 
     ELSE 0 
    END AS 'December 2016 Spends', 

    CASE 
     WHEN CONCAT(MONTHNAME(j.jobDate), ' ', YEAR(j.jobDate)) = 'January 2017' THEN GROUP_CONCAT(CONCAT(c.categoryName, ' ', s.supercategoryName)) 
     ELSE '-' 
    END AS 'January 2017 Services', 
    CASE 
     WHEN CONCAT(MONTHNAME(j.jobDate), ' ', YEAR(j.jobDate)) = 'January 2017' THEN SUM(j.totalCost + j.discountReceived) 
     ELSE 0 
    END AS 'January 2017 Spends', 

    CASE 
     WHEN CONCAT(MONTHNAME(j.jobDate), ' ', YEAR(j.jobDate)) = 'February 2017' THEN GROUP_CONCAT(CONCAT(c.categoryName, ' ', s.supercategoryName)) 
     ELSE '-' 
    END AS 'February 2017 Services', 
    CASE 
     WHEN CONCAT(MONTHNAME(j.jobDate), ' ', YEAR(j.jobDate)) = 'February 2017' THEN SUM(j.totalCost + j.discountReceived) 
     ELSE 0 
    END AS 'February 2017 Spends', 

    CASE 
     WHEN CONCAT(MONTHNAME(j.jobDate), ' ', YEAR(j.jobDate)) = 'March 2017' THEN GROUP_CONCAT(CONCAT(c.categoryName, ' ', s.supercategoryName)) 
     ELSE '-' 
    END AS 'March 2017 Services', 
    CASE 
     WHEN CONCAT(MONTHNAME(j.jobDate), ' ', YEAR(j.jobDate)) = 'March 2017' THEN SUM(j.totalCost + j.discountReceived) 
     ELSE 0 
    END AS 'March 2017 Spends' 
FROM jobs j 
LEFT JOIN categories c ON c.categoryID = j.categoryID 
LEFT JOIN supercategories s ON s.supercategoryID = c.supercategoryID 
LEFT JOIN users u ON u.userID = j.userID 
LEFT JOIN city ci ON ci.cityID = j.cityID 
WHERE j.jobStatus = 'completed' AND 
     DATE(j.jobDate) BETWEEN '2016-04-01' AND DATE(NOW()) 
GROUP BY u.userID 

查询输出:

======================================================== 
| userID | April 2016 | May 2016 | .... | January 2017 | 
======================================================== 
| 1234 | 1500 | 0  | .... |  0  | 
======================================================== 

所有的行正在转换到第一个出现列。如果我添加GROUP BY MONTHNAME(jobDate)然后我得到每个用户多行。你能帮助在这里可能是错误的吗?

+2

这类型的表枢轴需要动态的sql查询检查http://buysql.com/mysql/14-how-to-automate-pivot-tables.html – Blank

+2

当你必须滚动阅读查询时,现在是时候尽量减少问题! – jarlh

+0

这些是case表达式,不是语句 – jarlh

回答

1

你只是忘了对案件总和,看到前两个月, 必须2016年4月期间投入总和,因为你每月有多个记录(你可以看到你有两行

 SELECT u.userID, u.userFullName, ci.cityName, 
     GROUP_CONCAT(CASE WHEN CONCAT(MONTHNAME(j.jobDate), ' ', YEAR(j.jobDate)) = 'April 2016' THEN CONCAT(c.categoryName, ' ', s.supercategoryName) 
     END) AS 'April 2016 Services', 
     SUM(CASE WHEN CONCAT(MONTHNAME(j.jobDate), ' ', YEAR(j.jobDate)) = 'April 2016' THEN ROUND(j.totalCost + j.discountReceived) 
      ELSE 0 
     END) AS 'April 2016 Spends', 
    FROM jobs j 
    LEFT JOIN categories c ON c.categoryID = j.categoryID 
    LEFT JOIN supercategories s ON s.supercategoryID = c.supercategoryID 
    LEFT JOIN users u ON u.userID = j.userID 
    LEFT JOIN city ci ON ci.cityID = j.cityID 
    WHERE j.jobStatus = 'completed' AND 
      DATE(j.jobDate) BETWEEN '2016-04-01' AND DATE(NOW()) 
    GROUP BY u.userID 
+0

添加SUM()会给出错误 - “组函数的使用无效”。对于2016年4月的服务,“CONCAT”函数会生成字符串,而2016年4月的支出在CASE语句中已经有一个“SUM”。 –

+0

找出问题,需要在'CASE'语句上应用'GROUP_CONCAT'函数。我似乎无法编辑您的答案,请进行更改以便我可以批准。 –

+0

我忘了删除案件中的金额,我从group_concat中删除了金额 – user3600910