我正在尝试生成一份报告,我希望获得总销售价值和数量。 说明: 当客户的一些产品他们获得免费礼品,所以物品是两种类型的标准和免费礼品。当他们购买标准物品时,他们获得免费礼物,但并非所有客户都有资格获得。在数据库中,它们被硬编码为标准= 0并且免费赠送为= 1。
目标1:我只想获得免费礼品订单和订单总数。
目标2:我想计算每个免费礼物的数量,以找出前10名。 所有字段都在括号内。 以下是简单的例子。 希望这是有道理的。谢谢 。 结果:
我的剧本:
select
oh.[order date],
oh.[order guid],
[Item No_] as SKU
,ti.[Description],
ol.[quantity],
ol.Amount,
[EMS Available Quantity] as Stock_Qty,
(case when [Product Type]=0 then 'Standard'
when[Product Type]=1 then 'free_gift'
end) as Product_Type
from [Big$Item] TI
Inner join [Big$Inventory] I
ON I.[Item No_] = TI.[No_]
inner join [Big$Order Line] ol
on ti.[No_]=ol.[No_]
inner join [Big$Order header]oh
on oh.[order guid]=ol.[order guid]
where [Product Type] in ('0','1')
and oh.[order date] between'2017-06-12' and '2017-06-18'
order by [order date] asc
答案 0 :(得分:0)
最后我有一个解决方案 - 也许不是最美丽的解决方案 - 但它正在发挥作用:
我还添加了create语句和testdata插入 - 您还可以使用此测试链接重现它:http://rextester.com/JRV11837
第一个Select只返回至少有一个免费礼物的所有orderguid
。
用于加入的第二个Select i包括每个订单的总金额。当我使用INNER JOIN
时,最终结果将是包括freegifts在内的订单。
最后,我只是通过freegift的描述对结果集进行分组。
CREATE TABLE mygifttable
( Date datetime
,orderguid varchar(10)
,description varchar(55)
,sku int
,amount decimal)
;
INSERT INTO mygifttable VALUES
('2017-06-01', '1234', 'Sony Speakers' , 25, 100),
('2017-06-01', '1234', 'Sony Tv' , 23, 250),
('2017-06-01', '1234', 'Tv stand' , 11, 0),
('2017-06-01', '1235', 'Samsung Speakers', 28, 150),
('2017-06-01', '1235', 'Samsung Tv' , 26, 350),
('2017-06-01', '1235', 'Wall mount' , 10, 0),
('2017-06-01', '1236', 'Sony Speakers' , 25, 100),
('2017-06-01', '1236', 'Sony Tv' , 23, 250),
('2017-06-01', '1236', 'Tv stand' , 11, 0),
('2017-06-01', '1237', 'Apple mobiles' , 29, 900),
('2017-06-01', '1237', 'Apple cable' , 30, 800)
;
SELECT freegifttable.description
,SUM(freegifttable.freegift) as Free_Gifts
,SUM(totalamount.orderamount) as Total_Orderamount
FROM (
SELECT description
,orderguid
,SUM(IIF(amount = 0, 1,0)) as freegift
FROM mygifttable
GROUP BY description, orderguid
HAVING SUM(IIF(amount = 0, 1,0)) != 0
) freegifttable
INNER JOIN
(
SELECT orderguid
,SUM(amount) as orderamount
FROM mygifttable
GROUP BY orderguid
) totalamount
ON totalamount.orderguid = freegifttable.orderguid
GROUP BY freegifttable.description
;