SQL Server查询麻烦,关系很多

时间:2013-06-05 17:53:01

标签: sql sql-server

不确定如何在一行中说出这个问题,为标题道歉......

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

  • 商店
  • 项目
  • ShopStock

商店和物品有很多关系,因此ShopStock表将它们联系起来。

ShopStock中的字段为:

  • ID
  • ShopID
  • 的ItemID
  • CurrentStock

我想列出这些项目,显示每家商店有多少库存,但我遇到了SQL问题。像这样:

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

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

2 个答案:

答案 0 :(得分: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

假设每个商品ID为每个商品一个条目。如果有倍数,那么你必须使用SUM()它们,但想法是一样的。

答案 1 :(得分: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)