mysql - SQL Select 将行数据分散到列

标签 mysql sql

我有这个选择

SELECT  
        products.prod_name, SUM(beg_inv - end_inv)  AS inv,
        MONTH(task_date) MONTH
    FROM    performances 
        INNER JOIN tasks 
        ON performances.task_id = tasks.task_id
        INNER JOIN people
        ON people.person_id = tasks.emp_id
        INNER JOIN products
        ON performances.prod_id = products.prod_id
    WHERE   YEAR(task_date) = '2013'
    GROUP BY performances.prod_id, MONTH(task_date)
    ORDER BY MONTH(task_date), prod_name

它的输出是:

Prod name   inv month
Product 1   5   3
Product 1   10  5

我想像这样传播它:

Product Name    January February    March   April   May June    July    August  September   October November    December
Product 1                               5           10                          

是否可以无需进行透视而只需选择?

最佳答案

只需在 SQL 中执行数据透视操作,如下所示:

SELECT products.prod_name,
       SUM(case when MONTH(task_date) = 1 then beg_inv - end_inv end)  AS January,
       SUM(case when MONTH(task_date) = 2 then beg_inv - end_inv end)  AS February,
       SUM(case when MONTH(task_date) = 3 then beg_inv - end_inv end)  AS March,
       . . .  
FROM    performances 
        INNER JOIN tasks 
        ON performances.task_id = tasks.task_id
        INNER JOIN people
        ON people.person_id = tasks.emp_id
        INNER JOIN products
        ON performances.prod_id = products.prod_id
WHERE   YEAR(task_date) = 2013
GROUP BY products.prod_name,
ORDER BY products.prod_name,;

请注意,这还需要对 GROUP BYORDER BY 子句进行少量更改。

关于mysql - SQL Select 将行数据分散到列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22177982/

相关文章:

php - MySQL Rand() 不在子查询中?

MySQL按时间段对结果进行分组

android - 即使数据存在于数据库中,也无法从 sqlite 数据库检索数据

php - 当连接表是一对多时如何进行 SQL 查询

关系系统数据的 MySQL 数据库模式

sql - 数组字段包含元素的 Doctrine

sql - 只需从配置单元表中获取列名

sql - Oracle 存储过程中的临时表

php - MySQL 中的唯一 ID?

mysql - 在 MySQL 中,同一列有一个过滤器还是多个过滤器更快?