使用MySql透视数据

时间:2013-09-14 01:19:08

标签: mysql pivot

目标1: 您的销售数据存储在“购买”表中。 您的销售人员希望以分段形式查看销售数据,按季度细分。

如果您的购买表没有销售数据,请创建一些。确保数据跨越四个季度。 接下来,编写一个查询来透视数据,如下所示:

Album              Q1   Q2   Q3   Q4

OK Computer        2    5    3    7

 Sea Change        8    6    2    1 

不要创建单独的表或视图。不要改变任何表格。

将您的查询保存为dba1lesson10project1.sql并交给项目。

这就是我需要做的。但是,它希望我使用的表看起来像这样。它在作业中表明我根本无法改变它。

CustomerID    DateOfPurchase   SongID

1              2007-03-31        3
3              2007-06-30        4
4              2007-09-30        4
5              2007-12-31        5

我试过了

  SELECT SongID,
  SUM(CASE WHEN DateOfPurchase = '2007-03-31' THEN DateOfPurchase ElSE 0 END) AS 'Q1',
  SUM(CASE WHEN DateOfPurchase = '2007-06-30' THEN DateOfPurchase ELSE 0 END) AS 'Q2',
  SUM(CASE WHEN DateOfPurchase = '2007-09-30' THEN DateOfPurchase ELSE 0 END) AS 'Q3',
  SUM(CASE WHEN DateOfPurchase = '2007-12-31' THEN DateOfPurchase ELSE 0 END) AS 'Q4'
  FROM Purchases
  GROUP BY SongID;

与其他变体一起:

  SELECT SongID,
  SUM(CASE WHEN DateOfPurchase = '2007-03-31' THEN CustomerID ElSE 0 END) AS 'Q1',
  SUM(CASE WHEN DateOfPurchase = '2007-06-30' THEN CustomerID ELSE 0 END) AS 'Q2',
  SUM(CASE WHEN DateOfPurchase = '2007-09-30' THEN CustomerID ELSE 0 END) AS 'Q3',
  SUM(CASE WHEN DateOfPurchase = '2007-12-31' THEN CustomerID ELSE 0 END) AS 'Q4'
  FROM Purchases
  GROUP BY SongID;

  SELECT SongID,
  SUM(CASE WHEN DateOfPurchase = '2007-03-31' THEN SongID ElSE 0 END) AS 'Q1',
  SUM(CASE WHEN DateOfPurchase = '2007-06-30' THEN SongID ELSE 0 END) AS 'Q2',
  SUM(CASE WHEN DateOfPurchase = '2007-09-30' THEN SongID ELSE 0 END) AS 'Q3',
  SUM(CASE WHEN DateOfPurchase = '2007-12-31' THEN SongID ELSE 0 END) AS 'Q4'
  FROM Purchases
  GROUP BY SongID;

其中,最后2个几乎可以得到我所需要的东西。但是,每个SongID和Quarter只有一次购买。他们向我显示CustomerID或SongID。我基本了解我需要做什么。但是,如果不能改变表格来显示实际有多少购买,我不知道该怎么做。有什么建议吗?

2 个答案:

答案 0 :(得分:0)

您当前的查询非常接近,我建议稍作修改。您正在对日期进行硬编码,但如果您在第一季度的日期不等于2007-03-31它将不会显示,则会发生什么。

我会在MySQL中使用QUARTER()函数,这将根据日期值返回第1-4季度。

其次,我认为您不希望sum SongID,在您的CASE表达式中,我会将SongID替换为类似于以下内容的SELECT SongID, SUM(CASE WHEN Quarter(DateOfPurchase) = 1 THEN 1 ElSE 0 END) AS Q1, SUM(CASE WHEN Quarter(DateOfPurchase) = 2 THEN 1 ELSE 0 END) AS Q2, SUM(CASE WHEN Quarter(DateOfPurchase) = 3 THEN 1 ELSE 0 END) AS Q3, SUM(CASE WHEN Quarter(DateOfPurchase) = 4 THEN 1 ELSE 0 END) AS Q4 FROM Purchases GROUP BY SongID;

{{1}}

请参阅SQL Fiddle with Demo

答案 1 :(得分:0)

您可以使用MySQL Pivot table generator轻松完成此季度报告。  在创建报告时,系统会要求您添加"列设置" Column settings  请选择"采购表"作为" ",包含日期值的列为" 字段" 。选择日期值后,会出现功能菜单,请选择" 季度"根据您的要求,将您的数据透视表分成四分之一。请注意,如果您愿意,您可以选择创建一个特定年份的报告,在这种情况下,您应该检查" 确切年份"框并添加特定年份,否则将离开" 确切年份"框未经检查。

最终报告将能够看到类似此报告的内容:

http://mysqlpivottable.net/MySQL-Pivot-Table-Demo/tables/Quarterly_Sales_Report/