【问题标题】:SQL Server query troubles, many-many relationshipSQL Server查询麻烦,多对多关系
【发布时间】:2013-06-05 17:53:01
【问题描述】:

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

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

  • 商店
  • 项目
  • 商店库存

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

ShopStock 中的字段是:

  • 身份证
  • 店铺编号
  • 物品ID
  • 当前库存

我想列出商品,显示每家商店的库存量,但我遇到了 SQL 问题。像这样的:

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

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

【问题讨论】:

标签: sql sql-server


【解决方案1】:

这将更容易在多行中列出为 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)

【讨论】:

    【解决方案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() 它们,但想法是一样的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多