这个问题是基于从另一个SO question, can be found here得到的答案。sql查询再次销售汇总
我已成功地编写一个查询自己基于答案只要
Select s.pName,
s.ProductCode,
min(s.Price) as MinPrice,
sum(s.Quantity) as SalesQty,
sum(s.Price * s.Quantity) as SalesValue,
isnull((select sum(Quantity)
from Breakages
where pGroup = 16
and quantity > 0), 0) as BreakQty,
isnull((select sum(Price * Quantity)
from Breakages
where pGroup = 16), 0) as BreakValue,
isnull((select CASE
WHEN min(r.Quantity) != 0 THEN Sum(r.Quantity)
END), 0) as ReturnQty,
isnull((select sum(Price * Quantity)
from SalesReturn
where pGroup = 16), 0) as ReturnValue
from SalesLog as s
INNER JOIN SalesReturn as r
ON r.BillDate = s.BillDate
INNER JOIN Breakages as b
ON r.BillDate = b.BillDate
where s.BillDate = '12-10-2010'
and r.BillDate = '12-10-2010'
and b.BillDate = '12-10-2010'
and s.pGroup = 16
and b.pGroup = 16
and r.pGroup = 16
group by s.pName,
s.ProductCode;
这里是上述查询的输出
Name Code Price SalesQty SValue BreakQty BValue RefundQty RQty
CDM 42GRMS. 854 15 3 45 2 0 3 30
APPLE JUICE 750ML 860 59 5 295 2 0 3 30
BISLERI WATER 865 3 5 15 2 0 3 30
PERK 35 GRMS 870 10 20 200 2 0 3 30
有一个与输出一个问题,因为你可能不会得到,Code = 865的破损率为2,870的Refund为3,但所有的行都有破损和退款。
你可以在我的查询中找到实验。 感谢........等待回复来回
SalesRetrun表
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] [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]
SalesLog表
CREATE TABLE [dbo].[SalesLog](
[SalesID] [int] IDENTITY(1,1) NOT NULL,
[MemoNo] [int] NULL,
[ProductCode] [int] NULL,
[Quantity] [int] NULL,
[Price] [int] 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]
表破坏发生
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] [int] NULL,
[pGroup] [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]
更新的查询
我添加Products表参考,并呈现出所需的输出,但其显示所有产品是否有任何出售或断裂或发生退款或没有在该日期。
我不想在没有销售或没有损坏或没有退款的情况下显示行。这会减少我的报告大小。当前显示319行,但删除行(手动计算)后,根据我的逻辑它减少到16行(在假数据)
SELECT p.pName, p.pCode, MIN(p.pPrice) AS MinPrice
, SUM(s.Quantity) AS SalesQty, SUM(s.Quantity) * MIN(p.pPrice) AS SalesValue
, MIN(b.Quantity) AS BreakQty, MIN(b.Quantity) * MIN(p.pPrice) AS BreakValue
, MIN(r.Quantity) AS ReturnQty, MIN(r.Quantity) * MIN(p.pPrice) AS ReturnValue
FROM Products AS p
OUTER APPLY (SELECT SUM(s.Quantity) AS Quantity
FROM SalesLog AS s
WHERE s.BillDate = '12-10-2010'
AND s.ProductCode = p.pCode
) AS s
OUTER APPLY (SELECT SUM(r.Quantity) AS Quantity
FROM SalesReturn AS r
WHERE r.BillDate = '12-10-2010'
AND r.ProductCode = p.pCode
) AS r
OUTER APPLY (SELECT SUM(b.Quantity) AS Quantity
FROM Breakages AS b
WHERE b.BillDate = '12-10-2010'
AND b.ProductCode = p.pCode
) AS b
WHERE p.pGroup!=15 and p.pGroup!=16
GROUP BY p.pName, p.pCode;
你真的需要找到一种方法来写你的T-SQL更易读,更平易近人的方式!这只是一个巨大的,难以阅读和难以理解的角色混乱...... – 2010-06-30 16:15:09
@marc_s:有时候我会考虑让它保持原样,并且对这个问题的可读性做出评论意味着它更可能获得帮助... – 2010-06-30 16:23:17