2016-11-30 49 views
1

我正在努力庫存管理系統我在哪裏追蹤產品的發佈日期。所以,我的條件是 - 如果存儲ID爲1,今年是2014年,那麼它應該返回所有的產品針對特定年份的發行日期如下:使用左連接獲取所有日期

Product - Date - TotalIssued 
Keyboard - 2014-10-10 - 1 -- This product has been issued or given 1 time on that date of the year 2014 
Mouse - 2014-10-11 - 1 
Keyboard - 2014-10-12 - 0 
Mouse - 2014-10-12 - 0 
------------------------- 
------------------------- 
Keyboard - 2014-12-31 - 0 
Mouse - 2014-12-31 - 0 -- This will continue till the end of the year 

我試圖使用日曆表使用下面的鏈接,並創建一個:

Calendar Table

我用下面的查詢使用日曆表以獲得所需的輸出,但它僅返回已發出,這意味着僅存儲在該日期的產品在ReturnToStore表:

SELECT l.ItemName AS Product, m.PKDate AS Date, COUNT(m.PKDate) AS TotalIssued 
FROM [days] m 
LEFT JOIN ReturnToStore k ON CONVERT(DATE, k.IssuedDate) = m.PKDate 
LEFT JOIN Item l ON l.ItemID = k.ItemID 
WHERE m.calendar_year = 2014 AND k.StoreID = 1 
GROUP BY k.StoreID, l.ItemName, m.PKDate 

現在這是我得到的輸出:正如我我已經更新後:

Product - Date - TotalIssued 
Keyboard - 2014-10-10 - 1 
Mouse - 2014-10-11 - 1 

下面是表的結構:

CREATE TABLE [dbo].[Item](
     [ItemID] [int] IDENTITY(1,1) NOT NULL, 
     [ItemName] [varchar](50) NULL, 
     [Description] [varchar](150) NULL, 
     [Tag] [varchar](50) NULL, 
    CONSTRAINT [PK_Item] PRIMARY KEY CLUSTERED 
    (
     [ItemID] ASC 
    ) 
    ) ON [PRIMARY] 

    INSERT INTO [dbo].[Item] 
       ([ItemName] 
       ,[Description] 
       ,[Tag]) 
     VALUES 
       ('Keyboard', 'IT Equipment', ''), 
       ('Mouse', 'IT Equipment', '') 

    CREATE TABLE [dbo].[ReturnToStore](
     [ID] [int] IDENTITY(1,1) NOT NULL, 
     [StoreID] [int] NULL, 
     [CategoryID] [int] NULL, 
     [ItemID] [int] NULL, 
     [Quantity] [float] NULL, 
     [IssuedDate] [datetime] NULL, 
     [Description] [varchar](150) NULL, 
     [OrderID] [varchar](50) NULL, 
    CONSTRAINT [PK_ReturnToStore] PRIMARY KEY CLUSTERED 
    (
     [ID] ASC 
    ) 
    ) ON [PRIMARY] 

    INSERT INTO [dbo].[ReturnToStore] 
       ([StoreID] 
       ,[CategoryID] 
       ,[ItemID] 
       ,[Quantity] 
       ,[IssuedDate] 
       ,[Description] 
       ,[OrderID]) 
     VALUES 
       (1, 1, 1, 10, '2014-10-10 00:00:00.000', '', 'PO-02'), 
       (1, 1, 2, 20, '2014-10-11 00:00:00.000', '', 'PO-03') 

**Note:** I guess, this could be done easily with LEFT JOIN using calendar table. But got stuck here. 

編輯將查詢轉換爲以下幾點:

CREATE PROCEDURE [dbo].[MonthlyConsumption] 
@StoreID int, 
@Year int 

AS 

SELECT Distinct ItemName, 
    [1] AS M1, 
    [2] AS M2, 
    [3] AS M3, 
    [4] AS M4, 
    [5] AS M5, 
    [6] AS M6, 
    [7] AS M7, 
    [8] AS M8, 
    [9] AS M9, 
    [10] AS M10, 
    [11] AS M11, 
    [12] AS M12 
FROM 
(SELECT MONTH(m.PKDate) as YEAR, 
p.ItemName, k.IssuedDate, k.ItemID 
FROM [days] m 
CROSS JOIN (SELECT DISTINCT itemName,itemID FROM Item) p 
LEFT JOIN ReturnToStore k 
ON CONVERT(DATE, k.IssuedDate) = m.PKDate AND 
    p.itemid = k.itemid AND 
    k.StoreID = @StoreID 
LEFT JOIN Item l 
ON l.ItemID = k.ItemID 
WHERE m.calendar_year = @Year 
GROUP BY p.ItemName, m.PKDate, k.ItemID, k.IssuedDate) 

source 
PIVOT 
(
    COUNT(ItemID) 
    FOR YEAR 
    IN ([1], [2], [3], [4], [5], [6], [7], [8], [9], [10], [11], [12]) 
) AS PivotDay 

返回下面的輸出:

SP_Pivot

我不知道爲什麼它是重複的,如果我添加了同樣的產品比一次在特定日期較多,那麼就沒有在樞軸所示變化並且它與給定的輸出保持一致。

回答

1

你的第一個錯誤實際上是由於你的WHERE條款,而不是ON子句中放置在LEFT JOIN的右表的條件。

第二件事情,你也應該使用派生表項目名稱,就像日期:

SELECT p.ItemName AS Product, m.PKDate AS Date, COUNT(l.ItemID) AS TotalIssued 
FROM [days] m 
CROSS JOIN (SELECT DISTINCT itemName,itemID FROM Item) p 
LEFT JOIN ReturnToStore k 
ON CONVERT(DATE, k.IssuedDate) = m.PKDate AND 
    p.itemid = k.itemid AND 
    k.StoreID = 1 
LEFT JOIN Item l 
ON l.ItemID = k.ItemID 
WHERE m.calendar_year = 2014 
GROUP BY p.ItemName, m.PKDate 
+0

已處理,但對於TotalIssued列,它始終顯示爲1的所有日期。如果當年沒有在特定日期發佈產品,則TotalIssued列將爲0. –

+0

是的,需要對右側表中的不同列進行計數。立即試用@ AT-2016 – sagi

+0

完美工作。非常感謝@sagi。 –

1

我不知道,如果這是解決方案,但至少這是一種進步...

LEFT JOIN,把右側表的條件ON子句中得到真正的LEFT JOIN行爲。 (當在WHERE時,你會得到經常的INNER JOIN結果。) move k.StoreID = 1ON條款:

SELECT l.ItemName AS Product, m.PKDate AS Date, COUNT(m.PKDate) AS TotalIssued 
FROM [days] m 
LEFT JOIN ReturnToStore k ON CONVERT(DATE, k.IssuedDate) = m.PKDate AND k.StoreID = 1 
LEFT JOIN Item l ON l.ItemID = k.ItemID 
WHERE m.calendar_year = 2014 
GROUP BY l.ItemName, m.PKDate 
+0

查詢工作,但它沒有顯示爲未發行的日期,產品名稱對於TotalIssued列,它對所有日期顯示1。 –