使用MySQL连接表和数据透视

时间:2013-09-18 03:42:14

标签: mysql join 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 Albums.Title FROM Albums
 LEFT JOIN Songs
 INNER JOIN Purchases
 ON Songs.SongID = Purchases.SongID
 ON Albums.Title = Purchases.SongID,
 SELECT Title,
 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 Title;

当谈到加入三个单独的表然后转动数据时,我有点不知所措

我已尝试过多个其他变种中的上述代码,这些变种使我无法通过表格连接部分。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

在尝试PIVOT数据之前,我的建议是首先编写查询以返回所需的列,这将涉及加入表。你没有提供你的表定义,所以我对结构做了一些猜测。如果您的表格结构类似于以下内容:

CREATE TABLE Purchases
    (`CustomerID` int, `DateOfPurchase` datetime, `SongID` int)
;

CREATE TABLE Albums
    (`AlbumId` int, `Title` varchar(11))
;

CREATE TABLE Songs
    (`SongID` int, `AlbumID` int)
;

然后,您将使用类似于此代码的JOIN从表中进行SELECT:

select a.title,
  p.DateOfPurchase
from albums a
inner join songs s
  on a.albumid = s.albumId
inner join purchases p
  on s.songid = p.songid

此查询会返回相册Title以及您需要转移数据的DateOfPurchase。一旦你完成了JOINS,那么你可以用你的聚合函数和CASE表达式替换p.DateOfPurchase并添加GROUP BY子句来获得最终结果:

select a.title,
  SUM(CASE WHEN Quarter(p.DateOfPurchase) = 1 THEN 1 ElSE 0 END) AS Q1,
  SUM(CASE WHEN Quarter(p.DateOfPurchase) = 2 THEN 1 ELSE 0 END) AS Q2,
  SUM(CASE WHEN Quarter(p.DateOfPurchase) = 3 THEN 1 ELSE 0 END) AS Q3,
  SUM(CASE WHEN Quarter(p.DateOfPurchase) = 4 THEN 1 ELSE 0 END) AS Q4
from albums a
inner join songs s
  on a.albumid = s.albumId
inner join purchases p
  on s.songid = p.songid
group by a.title;

SQL Fiddle with Demo。这给出了一个结果:

|       TITLE | Q1 | Q2 | Q3 | Q4 |
| OK Computer |  1 |  0 |  0 |  0 |
|  Sea Change |  0 |  1 |  1 |  0 |