【发布时间】:2010-07-18 14:08:44
【问题描述】:
我有 4 个表,即 Products、SalesLog、Breakages、SalesReturn。
产品表
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]
销售记录表
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 和 Breakages(根据 SalesLog、Breakages 和 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”的价格变化,产品“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 查询或逻辑都会有所帮助...
谢谢你包容我............
【问题讨论】:
标签: sql-server-2005 sql c# tsql