不确定如何在一行中说出这个问题,为标题道歉......
我的数据库中有3个表,例如:
商店和物品有很多关系,因此ShopStock表将它们联系起来。
ShopStock中的字段为:
我想列出这些项目,显示每家商店有多少库存,但我遇到了SQL问题。像这样:
ITEM TESCO STOCK ASDA STOCK SAINSBURY STOCK
Apples 5 20 74
Pears 1000 32 250
如何构建SQL查询以显示这样的数据?
答案 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)