Sql server 2005 从SQL Server表计算销售额、退款和损坏
我有4张表,分别是Products、SalesLog、Breakages和SalesReturn 产品表 销售记录表 销售退货表 破损表 我必须根据SalesLOg、Breakages和SalesReturn的BillDate列,以以下模式生成一个报告来显示特定日期的SalesLOg、SalesReturn和Breakages 想要的产出 为了便于阅读,减少了输出列 正如你所看到的,由于A产品的价格变化,A产品已经上市两次。为此,我编写了一个查询:Sql server 2005 从SQL Server表计算销售额、退款和损坏,sql-server-2005,sql,c#,tsql,Sql Server 2005,Sql,C#,Tsql,我有4张表,分别是Products、SalesLog、Breakages和SalesReturn 产品表 销售记录表 销售退货表 破损表 我必须根据SalesLOg、Breakages和SalesReturn的BillDate列,以以下模式生成一个报告来显示特定日期的SalesLOg、SalesReturn和Breakages 想要的产出 为了便于阅读,减少了输出列 正如你所看到的,由于A产品的价格变化,A产品已经上市两次。为此,我编写了一个查询: SELECT SalesLog.pNa
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查询或逻辑都将有助于
谢谢你带我………试试这样的东西:
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表中存储了完整的价格变化历史记录-如果Products上只存储了最新的价格,则需要删除Products.pPrice=Sales\u Trans.price连接条件。thank you@Mark Bannister,我不知道您是如何帮助我的。此查询正在执行我想要的操作。非常感谢。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
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]
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
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
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