捆绑订单号

时间:2017-06-23 12:13:51

标签: sql sql-server-2012

我正在尝试生成一份报告,我希望获得总销售价值和数量。 说明: 当客户的一些产品他们获得免费礼品,所以物品是两种类型的标准和免费礼品。当他们购买标准物品时,他们获得免费礼物,但并非所有客户都有资格获得。在数据库中,它们被硬编码为标准= 0并且免费赠送为= 1。

目标1:我只想获得免费礼品订单和订单总数。

目标2:我想计算每个免费礼物的数量,以找出前10名。 所有字段都在括号内。 以下是简单的例子。 希望这是有道理的。谢谢 。 enter image description here 结果:enter image description here

我的剧本:

 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 

1 个答案:

答案 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
 ;