考虑以下表格
Inventory(storeid, itemid, qty)
Items(itemid, description, size, color)
这是我的任务:检索符合以下条件的商店的ID:对于其库存中保存的每个商品描述,商店都会为该描述保留所有可能尺寸的相应商品ID。
这是响应的外观:
3667
3706
3742
3842
我在哪里:
with s as (
select *
from inventory
inner join items using (itemID)
),
m as (
select count(distinct size), description
from items
group by description
),
sizes as (
select distinct size
from items
)
select distinct s1.storeID
from s s1
inner join m m1
on s1.description = m1.description
group by s1.storeID;
这只会返回storeid,其中包含与任何描述相匹配的商品...即每个商店。无法找到获取描述的方法并确保它具有所有三种尺寸(小,中,大)。
答案 0 :(得分:2)
它没有说三种尺寸,但是所有尺寸都可以,我喜欢数组:
WITH sizes AS (
SELECT description, array_agg(DISTINCT size) AS sizes
FROM items
GROUP BY description
)
,store_items AS(
SELECT s.storeID, it.description, array_agg(DISTINCT it.size) AS sizes
FROM stores AS s
JOIN inventory AS i
ON s.storeID = i.storeID
JOIN items AS it
ON i.itemID = it.itemID
GROUP BY s.storeID, it.description
)
SELECT s.storeID
FROM stores AS s
WHERE s.storeID NOT IN(
SELECT storeID
FROM store_items AS si
JOIN sizes z
ON z.description = si.description
AND si.sizes<>z.sizes)
答案 1 :(得分:1)
使用having子句,我们可以找到大小为3的描述。 然后,我们计算这些描述的数量,并将其与商店中描述的总数进行比较。
WITH countofdescirptions
AS (SELECT i.storeid,
Count(DISTINCT it.description)K
FROM inventory i
INNER JOIN items it
ON i.itemid = it.itemid
GROUP BY i.storeid),
has3
AS (SELECT i.storeid,
it.description
FROM inventory i
INNER JOIN items it
ON i.itemid = it.itemid
GROUP BY i.storeid,
it.description
HAVING Count(DISTINCT size) = 3)
SELECT *
FROM countofdescirptions
INNER JOIN (SELECT storeid,
Count(description)K
FROM has3
GROUP BY storeid) has3Count
ON countofdescirptions.storeid = has3Count.storeid
AND countofdescirptions.k = has3Count.k
我很确定使用COUNT()OVER
的解决方案