[請原諒格式錯誤 - 首先在這裏發帖,我試着做正確的事]使用SQL Server,我如何將記錄加入同一個表中所有「相似」記錄的最小值?
從功能上講,我只是試圖找到在其'喜歡'項目中具有最低價格的項目。例如 - 有大量的葡萄酒,但我需要找到價格最低的750毫升紅以及白葡萄酒;有很多奶酪,但我需要找到價格最低的8盎司CHEDDAR以及FETA;等
我發現所有的解決方案都說我做我的代碼中的同樣的事情。 我的「自我加入」一定有問題。它自己的select查詢運行時間不到10秒,嵌套select也是如此。但是,當我嘗試加入它們時,我的查詢會掛起並永遠無法完成。必須有一些方法可以成功完成此連接。
我擁有數百萬行數據。每一行都是唯一的商品/商店組合。我的嵌套選擇試圖找到我們對非「品牌」品牌商品的最低價格;在'like'項目中找到最低價格,由列確定:store_name,category,子類別,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
你可以給表結構和索引?另外,數據結構有問題,而且很可能永遠不會執行。商店應該是他們自己的桌子,並且取決於他們如何組織類別和子類別以及家庭和eff_pricetype。 – Luis 2012-01-26 23:19:48
是的,這很難。 reg_data_cube實際上是一個沒有索引的視圖。構成視圖的表有自己的索引,但我只能訪問視圖,而且我無法改變它。 :( – 2012-01-26 23:45:48
檢查EXPLAIN,但我認爲沒有太多的工作可以改善而沒有索引。 – Luis 2012-01-27 01:27:54