/ / Skontrolujte použiteľný skupinový dopyt pre nákupný košík - sql-server, sql-server-2008, tsql

Skontrolujte použiteľný dotaz skupiny pre nákupný košík - sql-server, sql-server-2008, tsql

Mám problém s podmienkou kontroly zľavy. Mám štruktúru tabuliek, ako je uvedené nižšie:

vozík stôl (id, customerid, productid) skupina stôl (groupid, groupname, discountamount) Skupinové produkty stôl (groupproductid, groupid, productid)

Pri zadávaní objednávky bude v košíku viac položiek. Chcem skontrolovať tie položky, ktoré majú najvyššiu skupinu, ak táto skupina pozostáva zo všetkých nákupných košíkov produktov?

príklad: Ak skupina 1 pozostáva z 2 produktov a tieto dva produkty existujú v tabuľke košíka, mala by sa vrátiť zľava skupiny 1.

prosím pomôžte

odpovede:

0 pre odpoveď č. 1

Je to zložité, bez skutočných definícií tabuliek ani vzorových údajov. Takže som si nejaké vymyslel:

create table Carts(
id int,
customerid int,
productid int
)
create table Groups(
groupid int,
groupname int,
discountamount int
)
create table GroupProducts(
groupproductid int,
groupid int,
productid int
)

insert into Carts (id,customerid,productid) values
(1,1,1),
(2,1,2),
(3,1,4),
(4,2,2),
(5,2,3)
insert into Groups (groupid,groupname,discountamount) values
(1,1,10),
(2,2,15),
(3,3,20)
insert into GroupProducts (groupproductid,groupid,productid) values
(1,1,1),
(2,1,5),
(3,2,2),
(4,2,4),
(5,3,2),
(6,3,3)

;With MatchedProducts as (
select
c.customerid,gp.groupid,COUNT(*) as Cnt
from
Carts c
inner join
GroupProducts gp
on
c.productid = gp.productid
group by
c.customerid,gp.groupid
), GroupSizes as (
select groupid,COUNT(*) as Cnt from GroupProducts group by groupid
), MatchingGroups as (
select
mp.*
from
MatchedProducts mp
inner join
GroupSizes gs
on
mp.groupid = gs.groupid and
mp.Cnt = gs.Cnt
)
select * from MatchingGroups

Ktorý spôsobuje tento výsledok:

customerid  groupid     Cnt
----------- ----------- -----------
1           2           2
2           3           2

To, čo tu „robíme“, sa nazýva „vzťahové“divízia "- ak chcete vyhľadať tento výraz inde. Podľa mojich aktuálnych výsledkov sa každý zákazník zhoduje iba s jednou skupinou - ak existuje viac zhôd, potrebujeme určité podmienky na rozdelenie väzieb, aby sme určili, ktorá skupina sa má nahlásiť. Vyzval som dvoma návrhmi v komentároch (najnižšia groupid alebo najvyššia discountamount). Vaša odpoveď na otázku „Pridané skôr“ nepomáha - nemáme stĺpec, ktorý obsahuje dátumy pridania skupín. Riadky nemajú v SQL inherentné usporiadanie.

Urobili by sme rozhodujúci zlom vo vymedzení pojmu MatchingGroups a posledný výber:

MatchingGroups as (
select
mp.*,
ROW_NUMBER() OVER (PARTITION BY mp.customerid ORDER BY /*Tie break criteria here */) as rn
from
MatchedProducts mp
inner join
GroupSizes gs
on
mp.groupid = gs.groupid and
mp.Cnt = gs.Cnt
)
select * from MatchingGroups where rn = 1