Получение предметов, которые были куплены вместе с определенными категориями и исключая ненужные категории - PullRequest
0 голосов
/ 21 октября 2018

У меня есть две таблицы, одна - это мое главное меню, а другая - моя таблица заказов.Я хочу получить все заказы, которые были приобретены на основе выбранной мной категории из таблицы главного меню, и исключить те заказы, которые были приобретены с определенными категориями.например:

Таблица главного меню

ItemCode       Category
-------------------------
10001         VM1
10002         VM1
10003         VM2
10004         VM3
10005         VM3
10006         HOT DRINKS
10007         HOT DRINKS
10008         COLD DRINKS
10009         COLD DRINKS
10066         DESSERT

Таблица заказов:

SiteID   BusinessDate   ItemName   Units Sold   Units Sale   ItemCode  OrderNo
----------------------------------------------------------------------------
1        06/08/2018     Apple         1             5        10001    122-1
1        06/08/2018     Coffee        1             16       10006    122-1
1        06/08/2018     Ice Tea       2             7        10008    122-1
1        06/08/2018     Beans         9             18       10004    122-1

4        06/08/2018     Donuts        7             17       10066    122-7

1        06/08/2018     Bread         1             7        10003    122-4
1        06/08/2018     Beans         4             8        10004    122-4

2        06/08/2018     OrangeJuice   2             5        10009    122-2
2        06/08/2018     Coffee        1             6        10006    122-2

3        06/08/2018     Bread         3             5        10003    122-3
3        06/08/2018     Beans         7             17       10004    122-3
3        06/08/2018     Coffee        17            17       10006    122-3

3        06/08/2018     Ice Tea       7             17       10008    122-5

4        06/08/2018     OrangeJuice   7             17       10009    122-6

Результат:

SiteID   BusinessDate   ItemName   Units Sold   Units Sale   ItemCode  OrderNo
----------------------------------------------------------------------------
4        06/08/2018     Donuts        7             17       10066    122-7

2        06/08/2018     OrangeJuice   2             5        10009    122-2
2        06/08/2018     Coffee        1             6        10006    122-2

3        06/08/2018     Ice Tea       7             17       10008    122-5

4        06/08/2018     OrangeJuice   7             17       10009    122-6

Ожидаемый результат :

Я хочу получить детали всех заказов, которые были приобретены с категорией, установленной в (ГОРЯЧИЕ НАПИТКИ, ХОЛОДНЫЕ НАПИТКИ, ДЕСЕРТ) и исключить эти OrderNo с категорией, установленной в (VM1, VM2, VM3).учитывая, что в заказе есть оба, весь OrderNo не должен появляться в моем выходном запросе.например: я не должен получать OrderNo: 122-3, поскольку он содержит коды предметов, которые присутствуют в моей категории таблицы основных предметов (VM2, VM3, HOT DRINKS).

Ответы [ 2 ]

0 голосов
/ 22 октября 2018

попробуйте это:

     Create Table #MasterMenu(itemCode Bigint,Category Varchar(50))

     Insert into #MasterMenu
    SElect 10001,'VM1' Union All
    SElect 10002,'VM1' Union All
    SElect 10003,'VM2' Union All
    SElect 10004,'VM3' Union All
    SElect 10005,'VM3' Union All
    SElect 10006,'HOT DRINKS' Union All
    SElect 10007,'HOT DRINKS' Union All
    SElect 10008,'COLD DRINKS' Union All
    SElect 10009,'COLD DRINKS' Union All
    SElect 10066,'DESSERT'


    Create Table #Order(SiteId int, BusinessDate Date,ItemName Varchar(50), UnitsSold int,UnitsSale int,ItemCode Bigint , OrderNo Varchar(50))

    Insert Into #Order
    SELECT 1,'06/08/2018','Apple  ',1 ,5 ,10001,'122-1' Union All
    SELECT 1,'06/08/2018','Coffee ',1 ,16,10006,'122-1' Union All
    SELECT 1,'06/08/2018','Ice Tea',2 ,7 ,10008,'122-1' Union All
    SELECT 1,'06/08/2018','Beans  ',9 ,18,10004,'122-1' Union All
    SELECT 4,'06/08/2018','Donuts ',7 ,17,10066,'122-7' Union All
    SELECT 1,'06/08/2018','Bread  ',1 ,7 ,10003,'122-4' Union All
    SELECT 1,'06/08/2018','Beans  ',4 ,8 ,10004,'122-4' Union All
    SELECT 2,'06/08/2018','OrangeJuice',2 ,5 ,10009,'122-2' Union All
    SELECT 2,'06/08/2018','Coffee ',1 ,6 ,10006,'122-2' Union All
    SELECT 3,'06/08/2018','Bread  ',3 ,5 ,10003,'122-3' Union All
    SELECT 3,'06/08/2018','Beans  ',7 ,17,10004,'122-3' Union All
    SELECT 3,'06/08/2018','Coffee ',17,17,10006,'122-3' Union All
    SELECT 3,'06/08/2018','Ice Tea',7 ,17,10008,'122-5' Union All
    SELECT 4,'06/08/2018','OrangeJuice',7 ,17,10009,'122-6' 

    ;with cte
    As
    (
        Select OrderNo,SUM(CASE WHEN ItemCode in (10001,10002,10003) then 1 ELSE 0 END) AS ItemCount
        from #Order
        Group by OrderNo
    )

    Select o.* from cte c
    INNER JOIN #Order o on c.OrderNo=o.OrderNo
    Where c.ItemCount=0


    Drop Table #MasterMenu
    Drop Table #Order

вывод:

SiteId  BusinessDate    ItemName    UnitsSold   UnitsSale   ItemCode    OrderNo
  2      2018-06-08     OrangeJuice    2            5         10009      122-2
  2      2018-06-08     Coffee         1            6         10006      122-2
  3      2018-06-08     Ice Tea        7            17        10008      122-5
  4      2018-06-08     OrangeJuice    7            17        10009      122-6
  4      2018-06-08     Donuts         7            17        10066      122-7
0 голосов
/ 21 октября 2018

Если я правильно понимаю, group by и having решают эту проблему:

select o.orderno
from orders o join
     mastermenu mm
     on o.itemcode = mm.itemcode
group by o.orderno
having sum(case when mm.category in ('HOT DRINKS', 'COLD DRINKS', 'DESSERT') then 1 else 0 end) > 0 and
       sum(case when mm.category in ('VM1', 'VM2', 'VM3') then 1 else 0 end) = 0;

sum(case . . . ) подсчитывает количество подходящих элементов для этих категорий.> 0 говорит, что по крайней мере один находится в заказе.= 0 говорит, что ни один не в порядке.

РЕДАКТИРОВАТЬ:

Это то, что вы хотите?

with om as (
      select o.*, mm.category
      from orders o join
           mastermenu mm
           on o.itemcode = mm.itemcode
     )
select om.*
from om
where om.category in ('HOT DRINKS', 'COLD DRINKS', 'DESSERT') and
      not exists (select 1 
                  from om om2
                  where om2.orderno = om.orderno and 
                        om2.category in ('VM1', 'VM2', 'VM3')
                 );
...