2010-07-18 41 views
0

我有4個表,即產品,銷售日誌,破損,銷售退貨。從SQL Server表計算銷售,退款和中斷

產品表

CREATE TABLE [dbo].[Products](
[ProductId] [int] IDENTITY(1,1) NOT NULL, 
[pName] [nvarchar](30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, 
[pSize] [int] NULL, 
[pPrice] [decimal](10, 2) NULL, 
[pPackQty] [int] NULL, 
[pGroup] [int] NULL, 
[pCode] [int] NULL, 
[OpenStock] [int] NULL, 
[CloseStock] [int] NULL, 
[YrlyOpenStock] [int] NULL, 
CONSTRAINT [PK_Products] PRIMARY KEY CLUSTERED 
(
[ProductId] ASC 
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] 
) ON [PRIMARY] 

SalesLog表

CREATE TABLE [dbo].[SalesLog](
[SalesID] [int] IDENTITY(1,1) NOT NULL, 
[MemoNo] [int] NULL, 
[ProductCode] [int] NULL, 
[Quantity] [int] NULL, 
[Price] [decimal](10, 2) NULL, 
[pGroup] [int] NULL, 
[pName] [nvarchar](30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, 
[pSize] [int] NULL, 
[BillDate] [nchar](10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, 
CONSTRAINT [PK_SalesLog] PRIMARY KEY CLUSTERED 
(
[SalesID] ASC 
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] 
) ON [PRIMARY] 

SalesReturn表

CREATE TABLE [dbo].[SalesReturn](
[srID] [int] IDENTITY(1,1) NOT NULL, 
[ProductCode] [int] NULL, 
[Quantity] [int] NULL, 
[pGroup] [int] NULL, 
[MemoNo] [int] NULL, 
[SalesmanID] [int] NULL, 
[Price] [decimal](10, 2) NULL, 
[JobShift] [int] NULL, 
[BillDate] [nchar](10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, 
[AddedOn] [datetime] NULL, 
CONSTRAINT [PK_SalesReturn] PRIMARY KEY CLUSTERED 
(
[srID] ASC 
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] 
) ON [PRIMARY] 

個表破壞發生

CREATE TABLE [dbo].[Breakages](
[breakId] [int] IDENTITY(1,1) NOT NULL, 
[MemoNo] [int] NULL, 
[SalesmanID] [int] NULL, 
[ProductCode] [int] NULL, 
[pName] [nvarchar](30) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, 
[Quantity] [int] NULL, 
[Price] [decimal](10, 2) NULL, 
[pGroup] [int] NULL, 
[JobShift] [int] NULL, 
[BillDate] [nchar](10) COLLATE SQL_Latin1_General_CP1_CI_AS NULL, 
[AddedOn] [datetime] NULL, 
CONSTRAINT [PK_Breakages_1] PRIMARY KEY CLUSTERED 
(
[breakId] ASC 
)WITH (PAD_INDEX = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY] 
) ON [PRIMARY] 

我有以生成單個報告以顯示SalesLOg,SalesReturn和特定日期的破裂(根據SalesLog,破損和SalesReturn的BillDate列)在以下的圖案。

通緝輸出

Code  ItemName  Price  SalesQty  BreakagesQty SalesReturnQty 
1   A   $10   50    2    2 
1   A   $12   150    1    10 
15   X   $5   56    0    2 
20   Z   $8   121    0    0 

爲閱讀

,你可以看到產品「A」已被列出,因爲該產品的價格變動的兩倍,爲了減少輸出列。實現這個我寫了一個查詢:

SELECT  SalesLog.pName, SalesLog.ProductCode, MIN(ItemGroup.gName) AS GroupName, 
      SalesLog.Price, SUM (SalesLog.Quantity) AS SalesQty, 
      SUM(SalesLog.Quantity * SalesLog.Price) AS SalesValue, 
    ISNULL ((SELECT  SUM(Quantity) AS Expr1 FROM Breakages 
     WHERE (ProductCode = SalesLog.ProductCode) AND (Price = SalesLog.Price) AND 
      (BillDate = '07/01/2010') AND (pGroup <> 15) AND (pGroup <> 16)), 0) AS BreakQty, 
    ISNULL ((SELECT  SUM(Quantity * Price) AS Expr1 
FROM   Breakages 
     WHERE  (ProductCode = SalesLog.ProductCode) AND (Price = SalesLog.Price) AND 
      (BillDate = '07/01/2010') AND (pGroup <> 15) AND (pGroup <> 16)), 0) AS BreakValue, 
    ISNULL ((SELECT  SUM(Quantity) AS Expr1 
FROM   SalesReturn 
     WHERE  (ProductCode = SalesLog.ProductCode) AND (Price = SalesLog.Price) AND 
      (BillDate = '07/01/2010') AND (pGroup <> 15) AND (pGroup <> 16)), 0) AS ReturnQty, 
    ISNULL ((SELECT  SUM(Quantity * Price) AS Expr1 
FROM   SalesReturn 
     WHERE  (ProductCode = SalesLog.ProductCode) AND (Price = SalesLog.Price) AND 
      (BillDate = '07/01/2010') AND (pGroup <> 15) AND (pGroup <> 16)), 0) AS ReturnValue, 
    ISNULL ((SELECT  SUM(Quantity) AS Expr1 
FROM   SalesLog 
     WHERE  (ProductCode = Products.pCode)), 0) AS CummSales 
FROM   SalesLog 
      INNER JOIN 
       ItemGroup ON ItemGroup.gCode = SalesLog.pGroup AND SalesLog.pGroup = ItemGroup.gCode 
      INNER JOIN 
       Products ON Products.pCode = SalesLog.ProductCode 
     WHERE (SalesLog.BillDate = '07/01/2010') AND (SalesLog.pGroup <> 15) AND 
       (SalesLog.pGroup <> 16) 
GROUP BY SalesLog.pName, SalesLog.ProductCode, SalesLog.Price, Products.pCode, Products.pPrice 
ORDER BY SalesLog.ProductCode, SalesLog.pName 

我與此查詢的問題是,它是無法顯示的項目的條目,其中沒有銷售,但有銷售回報。這個情況是由我的客戶給的。你能幫我解決這個問題嗎?任何T-SQL查詢或邏輯來實現這一條件將幫助...

感謝您對我的軸承.........

回答

1

嘗試是這樣的:

SELECT MIN(Products.pName) AS pName, 
     Products.pCode AS ProductCode, 
     MIN(Products.pGroup) AS GroupName, 
     Sales_Trans.Price, 
     SUM(Sales_Trans.Sales_Qty) AS SalesQty, 
     SUM(Sales_Trans.Sales_Value) AS SalesValue, 
     SUM(Sales_Trans.Break_Qty) AS BreakQty, 
     SUM(Sales_Trans.Break_Value) AS BreakValue, 
     SUM(Sales_Trans.Return_Qty) AS ReturnQty, 
     SUM(Sales_Trans.Return_Value) AS ReturnValue, 
FROM Products 
JOIN   
(SELECT ProductCode, Price, Quantity Sales_Qty, Price * Quantity Sales_Value, 0 Break_Qty, 0 Break_Value, 0 Return_Qty, 0 Return_Value FROM SalesLog 
WHERE (BillDate = '07/01/2010') AND (pGroup <> 15) AND (pGroup <> 16) 
UNION ALL 
SELECT ProductCode, Price, 0 Sales_Qty, 0 Sales_Value, 0 Break_Qty, 0 Break_Value, Quantity Return_Qty, Price * Quantity Return_Value FROM SalesReturn 
WHERE (BillDate = '07/01/2010') AND (pGroup <> 15) AND (pGroup <> 16) 
UNION ALL 
SELECT ProductCode, Price, 0 Sales_Qty, 0 Sales_Value, Quantity Break_Qty, Price * Quantity Break_Value, 0 Return_Qty, 0 Return_Value FROM Breakages 
WHERE (BillDate = '07/01/2010') AND (pGroup <> 15) AND (pGroup <> 16) 
) Sales_Trans 
ON (Products.pCode = Sales_Trans.ProductCode) and (Products.pPrice = Sales_Trans.Price) 
GROUP BY Products.pCode, Sales_Trans.Price 
ORDER BY 2,1 

(這假定價格變化的完整歷史存儲在產品表中 - 如果只有最新價格存儲在產品上,則需要移除Products.pPrice = Sales_Trans.Price加入條件。)

+0

謝謝@馬克班尼斯特,我不知道你是如何幫助我的。這個查詢正在做我想要的。非常感謝.......................................... – 2010-07-20 01:46:28

+0

我很高興幫助。 :) – 2010-07-20 10:03:54