/ / Sprawdź odpowiednie zapytanie grupowe dla koszyka - sql-server, sql-server-2008, tsql

Sprawdź odpowiednie zapytanie grupowe dla koszyka - sql-server, sql-server-2008, tsql

Mam problem z jednym z warunków sprawdzania rabatu. Mam strukturę tabel jak poniżej:

Wózek stół (id, customerid, productid) Grupa stół (groupid, groupname, discountamount) Produkty grupowe stół (groupproductid, groupid, productid)

Podczas składania zamówienia w koszyku będzie wiele pozycji, chcę sprawdzić te pozycje z najwyższą grupą, jeśli ta grupa składa się ze wszystkich produktów, które masz w koszyku?

Przykład: Jeśli grupa 1 składa się z 2 produktów i te dwa produkty znajdują się w tabeli koszyka, wówczas rabat z grupy 1 powinien zostać zwrócony.

proszę pomóż

Odpowiedzi:

0 dla odpowiedzi № 1

Jest to trudne, bez prawdziwych definicji tabel ani przykładowych danych. Więc wymyśliłem kilka:

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

Który daje ten wynik:

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

To, co tutaj „robimy, nazywa się„ relacją ”Division "- jeśli chcesz szukać w innym miejscu tego terminu. W moich obecnych wynikach każdy klient pasuje tylko do jednej grupy - jeśli jest wiele dopasowań, potrzebujemy pewnych warunków rozstrzygających, aby określić, którą grupę zgłosić. Poprosiłem o dwie sugestie w komentarzach (najniższy groupid lub najwyższy discountamount). Twoja odpowiedź „dodane wcześniej” nie pomaga - nie mamy kolumny zawierającej daty dodania grup. Wiersze nie mają wrodzonej kolejności w języku SQL.

Zrobilibyśmy remis w definicji MatchingGroups i ostateczny wybór:

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