2

不知道如何用一行来表达这个问题,为标题道歉......

我的数据库中有 3 个表,例如:

  • 店铺
  • 物品
  • 商店库存

Shop 和 Item 具有多对多关系,因此 ShopStock 表将它们链接起来。

ShopStock 中的字段为:

  • ID
  • 店铺编号
  • 物品编号
  • 当前股票

我想列出商品,显示每个商店有多少库存,但我遇到了 SQL 问题。像这样的东西:

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

如何构建 SQL 查询以显示这样的数据?

4

2 回答 2

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 的每个项目都有一个条目。如果有多个,那么你将不得不 SUM() 他们,但想法是一样的。

于 2013-06-05T18:03:33.283 回答
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 回答