[пожалуйста, прости за ошибки форматирования - первый пост здесь, и я искренне пытался сделать это правильно]
С функциональной точки зрения, я просто пытаюсь найти предметы с наименьшей ценой в группе «похожих» предметов. Например - есть тонны вин, но мне нужно найти КРАСНЫЙ 750 мл по самой низкой цене, а также БЕЛЫЙ; есть тонны сыров, но мне нужно найти ЧЕДДАР по 8 унций по самой низкой цене, а также FETA; и т.д.
Все найденные мной решения говорят о том же, что и в моем коде. Должна быть проблема с моим "само присоединением". Сам запрос на выбор выполняется менее чем за 10 секунд, как и вложенный выбор. Когда я пытаюсь присоединиться к ним, мой запрос зависает и никогда не завершается. Должен быть какой-то способ успешно выполнить это объединение.
У меня есть миллионы строк данных, из которых я извлекаю данные. Каждая строка представляет собой уникальную комбинацию товара / магазина. Мой вложенный выбор пытается найти самую низкую цену, которую мы имеем для предметов, которые НЕ являются «именной» маркой; самая низкая цена находится среди «похожих» товаров, что определяется по столбцам: store_name, category, subcategory, class, package_desc2, unit_name, chk (в моем запросе «chk» определяется по результатам двух разных столбцов).
Это дает мне четкий список всех комбинаций вышеупомянутых столбцов с самой низкой ценой для каждого. Я пытаюсь присоединить ТО к элементам бренда без «имени», чтобы увидеть, какие именно элементы имеют ту низкую цену, которую мы нашли во вложенном списке. Любая помощь приветствуется! Я занимаюсь этим уже несколько дней и не могу понять.
SQL здесь:
SELECT b.zone_name,
b.store_name,
b.family,
b.category,
b.subcategory,
b.class,
b.team,
b.subteam,
b.pos_dept,
b.brand_name,
b.item_description,
b.upc,
b.package_desc1 pkg,
b.package_desc2 sz,
b.unit_name,
CASE
WHEN b.good = 'good'
OR b.how_good = 1 THEN 'YES'
ELSE 'NO'
END AS chk,
b.eff_pricetype,
b.eff_price low_price,
b.cd dollar_sales,
b.cu unit_sales,
b.cgm margin_dollars,
b.cgm / Nullif(b.cd, 0) AS margin_pct,
b.deleted_item,
b.discontinue_item,
b.not_available,
b.remove_item,
b.recall_flag,
CASE
WHEN
SUM(
Isnull(b.deleted_item, 0) + Isnull(b.discontinue_item, 0) + Isnull(b.not_available, 0) + Isnull(b.remove_item, 0) + Isnull(b.recall_flag, 0)) = 0 THEN
'NO'
ELSE 'YES'
END AS istatus,
d.low
FROM mytable b
INNER JOIN(SELECT c.store_name,
c.category,
c.subcategory,
c.class,
c.package_desc2,
c.unit_name,
CASE
WHEN c.good = 'good'
OR c.how_good = 1 THEN 'YES'
ELSE 'NO'
END AS chk,
MIN(c.eff_price) low
FROM mytable c
WHERE store_name = 'some store'
AND brand_name NOT LIKE '%name%'
AND weeks = 'Last 12 weeks'
AND ( eff_pricetype = 'REG'
OR eff_pricetype = 'EDV'
OR eff_pricetype = 'GBC'
OR eff_pricetype = 'CMP'
OR eff_pricetype = 'LIN'
OR eff_pricetype = 'FRZ'
OR eff_pricetype = 'GBB'
OR eff_pricetype = 'EDLP'
OR eff_pricetype = 'GBN'
OR eff_pricetype = 'GBR'
OR eff_pricetype = 'MKT'
OR eff_pricetype = 'COMP'
OR eff_pricetype = 'R'
OR eff_pricetype = 'COM' )
AND ( family = 'carrots'
OR family = 'tomatoes'
OR family = 'Cheese'
OR family = 'Coffee'
OR family = 'peppers'
OR family = 'milk'
OR family = 'oil'
OR family = 'season'
OR family = 'Housewares'
OR family = 'paper'
OR family = 'Meat'
OR family = 'soup'
OR family = 'nuts'
OR family = 'pizza'
OR family = 'potatoes'
OR family = 'Seafood'
OR family = 'beer'
OR family = 'vitamins'
OR family = 'Tea'
OR family = 'Wine'
OR family = 'beans' )
GROUP BY c.store_name,
c.category,
c.subcategory,
c.class,
c.package_desc2,
c.unit_name,
c.good,
c.how_good
HAVING MIN(c.eff_price) > 0) AS d
ON b.store_name = d.store_name
AND b.category = d.category
AND b.subcategory = d.subcategory
AND b.class = d.class
AND b.package_desc2 = d.package_desc2
AND b.unit_name = d.unit_name
AND CASE
WHEN b.good = 'good'
OR b.how_good = 1 THEN 'YES'
ELSE 'NO'
END = d.chk
AND b.eff_price = d.low
WHERE store_name = 'some store'
AND brand_name NOT LIKE '%name%'
AND weeks = 'Last 12 weeks'
AND ( eff_pricetype = 'REG'
OR eff_pricetype = 'EDV'
OR eff_pricetype = 'GBC'
OR eff_pricetype = 'CMP'
OR eff_pricetype = 'LIN'
OR eff_pricetype = 'FRZ'
OR eff_pricetype = 'GBB'
OR eff_pricetype = 'EDLP'
OR eff_pricetype = 'GBN'
OR eff_pricetype = 'GBR'
OR eff_pricetype = 'MKT'
OR eff_pricetype = 'COMP'
OR eff_pricetype = 'R'
OR eff_pricetype = 'COM' )
AND ( family = 'carrots'
OR family = 'tomatoes'
OR family = 'Cheese'
OR family = 'Coffee'
OR family = 'peppers'
OR family = 'milk'
OR family = 'oil'
OR family = 'season'
OR family = 'Housewares'
OR family = 'paper'
OR family = 'Meat'
OR family = 'soup'
OR family = 'nuts'
OR family = 'pizza'
OR family = 'potatoes'
OR family = 'Seafood'
OR family = 'beer'
OR family = 'vitamins'
OR family = 'Tea'
OR family = 'Wine'
OR family = 'beans' )
GROUP BY b.zone_name,
b.store_name,
b.family,
b.category,
b.subcategory,
b.class,
b.team,
b.subteam,
b.pos_dept,
b.brand_name,
b.item_description,
b.upc,
b.package_desc1,
b.package_desc2,
b.unit_name,
d.org,
b.eff_pricetype,
b.eff_price,
b.cd,
b.cu,
b.cgm,
b.deleted_item,
b.discontinue_item,
b.not_available,
b.remove_item,
b.recall_flag,
d.low,
b.good,
b.how_good