0

目的 1: 販売データは Purchases テーブルに格納されます。あなたの営業スタッフは、売上データをピボット形式で四半期ごとに分類して表示したいと考えています。

Purchases テーブルに売上データがない場合は、作成します。データが 4 四半期にわたることを確認してください。次に、データをピボットするクエリを次のように記述します。

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

タイトルでグループ化できるように、3 つのテーブルを結合する必要があることはわかっています。私の曲、アルバム、および購入テーブルです。

 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;

3つの別々のテーブルを結合してからデータをピボットすることになると、私はここでちょっと途方に暮れています

上記のコードを他の複数のバリアントで試しましたが、テーブル結合部分を通過できませんでした。

どんな助けでも大歓迎です。

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 します。

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とアルバムを返します。DateOfPurchaseJOINS が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 に答える