我正在努力尋找一種在 SQL 中創建表的方法,我可以在其中合并所有銷售日期和可用產品。我的任務是創建一個表格,其中包含 2022 年 1 月 1 日到 2022 年 12 月 31 日之間的一系列日期。
我的資料樣本包含 01/01/2022 和 31/12/2022 之間的日期。日期表是我生成年份日期的表,我必須使用它來匹配我的產品和銷售額。
CREATE TABLE Date_Table (
DateID INT IDENTITY CONSTRAINT PK_Date_Table PRIMARY KEY,
Date DATE NOT NULL,
Month TINYINT NOT NULL,
Year INT NOT NULL
);
CREATE TABLE Sales_Table (
SaleID INT IDENTITY CONSTRAINT PK_Sales_Table PRIMARY KEY,
Date_of_Sale DATE NOT NULL,
Qty_sold INT NOT NULL,
Total MONEY NOT NULL,
ProductID INT NOT NULL CONSTRAINT FK_Product_Table REFERENCES Product_table(ProductID));
);
CREATE TABLE Product_table (
ProductID INT IDENTITY CONSTRAINT PK_Product_Table PRIMARY KEY,
ProductName NVARCHAR(25) NOT NULL,
ProductNumber NVARCHAR(25) NOT NULL
);
我還沒有找到一種方法來創建一個如下所示的表:
| 日期 | 產品 | “售出數量” |
|---|---|---|
| 2022-01-01 | AB1 | 0 |
| 2022-01-01 | AB2 | 2個 |
| 2022-01-01 | AB3 | 1個 |
| 2022-01-01 | AB4 | 0 |
| 2022-01-01 | AB5 | 2個 |
| 2022-01-02 | AB1 | 3個 |
| 2022-01-02 | AB2 | 1個 |
| 2022-01-02 | AB3 | 0 |
| 2022-01-02 | AB4 | 0 |
| 2022-01-02 | AB5 | 0 |
因此,即使沒有銷售,我也希望所有日期都與所有產品相匹配。我已經為此作業了一段時間,但似乎找不到解決方案。如果有人有一點想法可以幫助我開始,將不勝感激
到目前為止,我剛剛在我的表之間進行了一些連接,希望完全連接可以讓我保留所有必要的資料,但它不起作用。
uj5u.com熱心網友回復:
這樣做的訣竅是首先創建所有行,然后才填充銷售數量。
創建所有行的最簡單方法是執行CROSS JOIN例如,
SELECT Date_Table.[Date], Product_Table.ProductID, Product_Table.ProductName
FROM Date_Table
CROSS JOIN Product_Table
以上將為您在每個日期為每個產品提供一行(因此,如果 5 個產品為 365 天,則為 365 x 5 = 1825 行)。
有了這個,您就可以使用 LEFT JOIN 將它加入到您的實際銷售額中,這樣即使它們在銷售額中沒有匹配,它也會保留您的初始行。并且要處理空白行,請使用 ISNULL 使它們為 0。
SELECT Date_Table.[Date], Product_Table.ProductID, Product_Table.ProductName,
ISNULL(Sales_Table.Qty_sold, 0) AS Qty_Sold
FROM (Date_Table
CROSS JOIN Product_Table)
LEFT OUTER JOIN Sales_Table ON Date_Table.[Date] = Sales_Table.[Date_of_sale]
AND Product_Table.ProductID = Sales_Table.ProductID
編輯:這是一個db<>fiddle資料和 SQL 供您查看
關于資料結構設定的兩個注意事項
- 您的 PK——我通常會嘗試使 PK 有意義(例如,在日期表中,使用日期作為 PK)——盡管這不是必需的。但是,我建議至少在它們上放置一個非聚集索引,以便您可以直接查找日期(或產品等)。
- 我也會避免使用像日期、月份、年份這樣的 SQL 關鍵字的列名——我還會考慮命名具有更多含義的列,例如,將其稱為“Total_Revenue”或“Total_Cost”,而不是“Total”。你的大部分領域都遵循這條規則,但是......只是讓你知道。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/537812.html
