admin

SQL Server查询麻烦,多对多关系

sql

不确定如何将这个问题写成一行,对标题表示歉意…

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

  • Shop
  • Item
  • ShopStock

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

ShopStock中的字段是:

  • ID
  • ShopID
  • ItemID
  • CurrentStock

我想列出项目,显示每个商店有多少库存,但是我在使用SQL时遇到了麻烦。像这样的东西:

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

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


阅读 173

收藏
2021-06-07

共1个答案

admin

这样可以更容易地在多行中将其列为项目,商店,当前库存。照原样,除非您知道商店的数量,否则将需要使用动态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)
2021-06-07