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

标签 sql sql-server

不知道如何在一行中表达这个问题,对标题表示歉意......

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

  • 商店
  • 项目
  • 商店库存

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

ShopStock 中的字段是:

  • 身份证
  • 商店ID
  • 商品ID
  • 当前库存

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

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

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

最佳答案

这样可以更容易地在多行中列出商品、商店、当前库存。事实上,除非您知道商店的数量,否则您将需要使用动态 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)

关于SQL Server查询麻烦,多对多关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16946641/

相关文章:

mysql - sql 查询查找可用日期

php - 如何将表从一个mysql数据库复制到另一个mysql数据库

c# - "Error converting data type nvarchar to int."执行存储过程

sql - 检索配置值 SQL 错误日志

sql - 使用暂存表和事件表被认为是一种反模式

sql - 有效日期格式检查 Oracle - 奇怪的行为

mysql - 将行分组为相同大小的 block 并获取某些列的聚合

SQL Server 2008 包含列

sql - 在子句中包含许多值 - SQL

sql-server - SQL Server 2012 : How to find common values in a column