2

この質問を 1 行でどのように表現すればよいかわかりません。タイトルについてお詫び申し上げます...

たとえば、データベースに 3 つのテーブルがあります。

  • アイテム
  • ショップストック

Shop と Item には多対多の関係があるため、ShopStock テーブルはそれらをリンクします。

ShopStock のフィールドは次のとおりです。

  • ID
  • ショップID
  • アイテムID
  • 現在のストック

各ショップの在庫数を一覧表示したいのですが、SQLがうまくいきません。このようなもの:

ITEM   TESCO STOCK   ASDA STOCK   SAINSBURY STOCK
Apples 5             20           74
Pears  1000          32           250

このようなデータを表示する SQL クエリを作成するにはどうすればよいですか?

4

2 に答える 2

2

複数の行に item、shop、currentstock としてリストする方が簡単です。そのままでは、ショップの数がわからない場合は、動的 SQL を使用する必要があります。潜在的なショップの数がわかっている場合は、 を使用PIVOTして結果を返すことができます。

2 つのショップ (shop1 と shop2) があると仮定すると、次のようになります。

select item_name, [Shop1], [Shop2]
from 
(
  select item_name, shop_name, currentstock
  from item i
  join shopstock ss on i.item_id = ss.item_id 
  join shop s on s.shop_id = ss.shop_id
) x
pivot 
(
  max(currentstock)
  for shop_name in ([Shop1],[Shop2])
) p

可能なショップの数がわからないので、動的SQLアプローチを次に示します。

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = stuff((select distinct ',' + quotename(shop_name) 
                    from shop
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'select item_name,' + @cols + '
             from 
             (
                select item_name, shop_name, currentstock
                from item i
                  join shopstock ss on i.item_id = ss.item_id 
                  join shop s on s.shop_id = ss.shop_id
            ) x
            pivot 
            (
                max(currentstock)
                for shop_name in (' + @cols + ')
            ) p '

execute(@query)
于 2013-06-05T18:09:25.850 に答える
2

特定の名前を取得するには JOINS を追加する必要があるかもしれませんが、これはあなたが求めているアイデアです:

SELECT ItemID
     , MAX(CASE WHEN ShopID = 'Tesco' THEN CurrentStock ELSE 0 END)'Tesco Stock'
     , MAX(CASE WHEN ShopID = 'ASDA' THEN CurrentStock ELSE 0 END)'ASDA Stock'
     , MAX(CASE WHEN ShopID = 'Sainsbury' THEN CurrentStock ELSE 0 END)'SainsburyStock'
FROM ShopStock 
GROUP BY ItemID

shopID ごとにアイテムごとに 1 つのエントリを想定しています。複数ある場合は、それらを SUM() する必要がありますが、考え方は同じです。

于 2013-06-05T18:03:33.283 に答える