0

目标 1:您的销售数据存储在 Purchases 表中。您的销售人员希望以透视的形式查看按季度细分的销售数据。

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

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;

在加入三个单独的表然后旋转数据时,我有点不知所措

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

任何帮助将非常感激。

4

1 回答 1

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 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 后,您可以用p.DateOfPurchase聚合函数和 CASE 表达式替换 ,并添加 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 |
于 2013-09-18T11:26:01.777 回答