2010-07-18 72 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