我有一个表的工作具有以下结构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)
然后我得到每个用户多行。你能帮助在这里可能是错误的吗?
这类型的表枢轴需要动态的sql查询检查http://buysql.com/mysql/14-how-to-automate-pivot-tables.html – Blank
当你必须滚动阅读查询时,现在是时候尽量减少问题! – jarlh
这些是case表达式,不是语句 – jarlh