2012-01-26 1 views
1

[ここerrors--最初のポストをフォーマット赦し、私は右のそれを行うことを真剣にしようとしたしてください]SQL Serverを使用して、同じテーブルのすべての「類似」レコードの最小値にレコードを結合するにはどうすればよいですか?

は機能的に言​​えば、私は単に項目「のような」はそのグループに最低価格を持っているアイテムを見つけようとしています。たとえば、たくさんのワインがありますが、最低価格の750ml REDとWHITEを見つける必要があります。たくさんのチーズがありますが、私は最低価格の8oz CHEDDARとFETAを見つける必要があります。

私が見つけたすべての解決策は、自分のコードにあるのと同じことをすると言います。 自分の「自己参加」に問題があるはずです。選択クエリは10秒未満で実行され、ネストされた選択も実行されます。しかし、私はそれらに参加しようとすると、私のクエリがハングし、決して終了しません。この結合を正常に実行するには、何らかの方法が必要です。

私は何百万行ものデータを持っています。各行はユニークなアイテム/ストアの組み合わせです。私のネストされた選択は、 "名前"のブランドではないアイテムに対して私たちが持っている最低の価格を見つけることを試みています。 store_name、category、subcategory、class、package_desc2、unit_name、chk(私のクエリでは、 "chk"は2つの異なる列の結果によって決定されます)の列によって決定されるような、

これは、前述の列のすべての組み合わせの個別のリストを、それぞれの価格が最も低いものにします。私は、ネームド・セレクトで見つけた安価なものが正確なものであるかどうかを調べるために、非「名前」ブランド・アイテムにTHATに参加しようとしています。どんな助けもありがとう!私はこれを数日間してきたが、それを理解することはできない。ここ

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

+0

ええ、それは厳しいです。 reg_data_cubeは実際にはインデックスのないビューです。ビューを構成するテーブルには独自のインデックスがありますが、ビューにしかアクセスできず、変更できません。 : –

+0

EXPLAINをチェックしてくださいが、インデックスなしで改善するためにできることはあまりありません。 – Luis

答えて

1

あなたはあなたのコードを簡素化し、おそらく代わりに、またはINを使用し、ご家族や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... 

、あなたは彼らが言うように、あなたのサブクエリが作業している場合、2つの異なるテーブル変数に入れ、その後、それらを結合することができます。

+0

あなたの応答に感謝します!私はテーブル変数を試してみましょう、あなたはそれがどのように行くのかを教えてあげます –

+0

私は実際に使用しましたtempテーブルを作成し、行番号を反映していたIDカラムを主キーとして追加しました.14秒で実行されました。 –

関連する問題