将数据填充为列的单个日期

时间:2017-04-19 07:46:31

标签: mysql sql

我创建了一个查询,为我提供当天每个部门的销售总额。

我想要的是使用一个主查询生成整个月的数据。

这是我期望看到的结果:

Department No  Department Name  1-April  2-April  3-April
1               Infants          100      112      96
2               Kids             120      132      123
Total Total                      220      144      219  

目前,我只能生成一天,我必须不断更改日期值以获取第二天的数据。

如前所述,我想在一个主查询中运行整个月。

3 个答案:

答案 0 :(得分:0)

请尝试以下方法......

SELECT CONCAT( 'SELECT department.id AS `Department No`,
                       department.departmentName AS `Department Name`',
               GROUP_CONCAT( ', SUM( date_',
                             DATE_FORMAT( salesDate, '%d_%M' ),
                             '.sales ) AS `',
                             DATE_FORMAT( salesDate, '%e-%M' ),
                             '`',
                             SEPARATOR '' ),
               ' FROM department',
               GROUP_CONCAT( ' LEFT JOIN departmentSales AS date_',
                             DATE_FORMAT( salesDate, '%d_%M' ),
                             ' ON department.id = date_',
                             DATE_FORMAT( salesDate, '%d_%M' ),
                             '.department_id AND date_',
                             DATE_FORMAT( salesDate, '%d_%M' ),
                             '.salesDate = `',
                             DATE_FORMAT( salesDate, '%Y-%M-%d' ),
                             '`',
                             SEPARATOR '' ),
               ' GROUP BY department.id
                ORDER BY department.id
                UNION
                SELECT `Totals`,
                       ` `,
               GROUP_CONCAT( ', SUM( date_',
                             DATE_FORMAT( salesDate, '%d_%M' ),
                             '.sales )',
                             SEPARATOR '' ),
               ' FROM department',
               GROUP_CONCAT( ' LEFT JOIN departmentSales AS date_',
                             DATE_FORMAT( salesDate, '%d_%M' ),
                             ' ON department.id = date_',
                             DATE_FORMAT( salesDate, '%d_%M' ),
                             '.department_id AND date_',
                             DATE_FORMAT( salesDate, '%d_%M' ),
                             '.salesDate = `',
                             DATE_FORMAT( salesDate, '%Y-%M-%d' ),
                             '`',
                             SEPARATOR '' ),
               ' ) INTO @salesQuery
FROM ( SELECT DISTINCT salesDate
       FROM departmentSales
       WHERE salesDate BETWEEN FROM_DAYS( TO_DAYS( targetDate ) -
                                          DAYOFMONTH( targetDate ) +
                                          1
                                        )
                           AND LAST_DAY( targetDate )
     ) AS salesDateFinder;

PREPARE salesTotals FROM @salesQuery;
EXECUTE salesTotals;

此尝试基于mysql select dynamic row values as column names, another column as value处的代码。我担心group_concat_max_len变量是个问题。如果是,那么我将加强对所提到的CASE方法的研究。如果这不是问题,那么我会更容易一些。

这里的大多数行实际上只构成一个SQL语句。它接受由末尾附近的子查询构造的salesDate值列表,然后用于帮助构造一个包含要对数据库运行的SQL语句的相当长的字符串。

该字符串由指定为函数CONCAT()的参数的子字符串列表组成,您可以在https://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_concat阅读该字符串。

字符串首先指定表id中的字段departmentNamedepartment应该是每个记录的第一个,然后是每个日期的SUM()该部门的销售额。每个日期字段的名称都为date_09_March,输出中的标题为9-March

使用GROUP_CONCAT函数可以实现字符串的重复段,您可以在https://dev.mysql.com/doc/refman/5.7/en/group-by-functions.html#function_group-concat阅读该函数。

在指定字段后,字符串指定值应来自department LEFT JOIN形成的临时表,每个日期都有departmentSales表的实例,每个实例被赋予date_09_March之类的别名,并在其department_id字段上加入id的{​​{1}}字段。

一旦形成,临时表的记录按department分组,以便计算每个部门的总数。然后输出按department.id排序。

然后,用于生成此排序输出及其列标题的语句将连接到用于生成总计行的另一个(稍微简单)语句。然后,将包含由每个子字符串的串联形成的SQL语句的字符串分配给变量@salesQuery,准备并执行。

如果您有任何问题或意见,请随时发表评论。

进一步阅读

https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html(有关所使用的department.id函数的信息)

答案 1 :(得分:0)

感谢所有答案 我设法根据Pivot函数编写了一个查询。

答案 2 :(得分:-2)

您可以使用以下内容控制日期范围:

select (...) where v_date >= 1-April and v_date <= 30-April

(考虑v_date列的名称和日期格式的1月4日)