简体   繁体   English

带 CASE 语句的 GROUP BY

[英]GROUP BY with CASE statement

I have a table jobs with the following structure我有一个具有以下结构的表工作

================================================
| 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    |
================================================

I want the month to be transposed into columns.我希望将月份转换为列。

Expected Output:预期输出:

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

My query:我的查询:

 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

Query Output:查询输出:

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

All the rows are getting transposed into the first occurrence column.所有的行都被转置到第一个出现的列中。 If I add GROUP BY MONTHNAME(jobDate) then I get multiple rows per user.如果我添加GROUP BY MONTHNAME(jobDate)那么我会为每个用户获得多行。 Can you help what can be wrong here?你能帮忙看看这里有什么问题吗?

you just forgot to put sum on the case , see the first two months, you must put sum since you have multiple records per month (you can see you have two rows during April 2016你只是忘了把 sum 放在 case 上,看到前两个月,你必须把 sum 因为你每个月有多条记录(你可以看到你在 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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM