2012-01-26 61 views
1

[請原諒格式錯誤 - 首先在這裏發帖,我試着做正確的事]使用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 
+0

你可以給表結構和索引?另外,數據結構有問題,而且很可能永遠不會執行。商店應該是他們自己的桌子,並且取決於他們如何組織類別和子類別以及家庭和eff_pricetype。 – Luis 2012-01-26 23:19:48

+0

是的,這很難。 reg_data_cube實際上是一個沒有索引的視圖。構成視圖的表有自己的索引,但我只能訪問視圖,而且我無法改變它。 :( – 2012-01-26 23:45:48

+0

檢查EXPLAIN,但我認爲沒有太多的工作可以改善而沒有索引。 – Luis 2012-01-27 01:27:54

回答

1

您可以簡化您的代碼,並可能改變你的家人和pricetype子句中使用的替代或改進的性能。

例如:

AND eff_pricetype IN ('REG','EDV','GBC','CMP','LIN','FRZ', 
         'GBB','EDLP','GBN','GBR','MKT','COMP','R','COM') 

    AND family IN ('carrots','tomatoes','Cheese','Coffee', etc... 

另外,如果你的子查詢工作,你說他們是,你可以把它們放到兩個不同的表變量,然後加入他們的行列。

+0

感謝您的迴應!我會給表變量一個嘗試,讓你知道它是怎麼回事 – 2012-01-26 23:58:13

+0

我實際上使用過一個臨時表,並添加了一個ID列,它只是將行號反映爲主鍵,它在14秒內運行,謝謝! – 2012-01-27 20:53:56

相關問題