我在Sybase数据库中有一个数据集,该数据集由以下SQL Fiddle
建模使用以下基本查询,我可以提取后续数据:
查询:
SELECT [Scancode], [Product Name], [Store Name], [Quantity]
FROM Sales
JOIN Items
ON Items.PK = Sales.ITM_FK
JOIN Stores
ON Stores.PK = Sales.STO_FK
数据:
SCANCODE PRODUCT NAME STORE NAME QUANTITY
123456789 Milk Tokyo 19
123456789 Milk New York 28
123456789 Milk London 37
987654321 Eggs Tokyo 46
987654321 Eggs New York 55
987654321 Eggs London 64
192837465 Bread Tokyo 73
192837465 Bread New York 82
192837465 Bread London 91
我想以“以项目为中心”的格式检索数据:
SCANCODE PRODUCT NAME Tokyo Sales New York Sales London Sales
123456789 Milk 19 28 37
987654321 Eggs 46 55 64
192837465 Bread 73 82 91
是否有可扩展的&以这种格式检索数据的有效方法是什么?
~extended意味着可以在不修改查询的情况下添加更多商店。
答案 0 :(得分:0)
在SQL Server中,您可以使用动态SQL执行此操作。您需要首先构建一个您可以动态地在数据透视查询中使用的商店列表。
注意:为简单起见,我将源数据替换为src
表。
declare @stores as nvarchar(max)
select @stores = STUFF( (select distinct N',' + QUOTENAME([STORE NAME])
from src
FOR XML PATH(N'')), 1, 1, N'')
declare @sql as nvarchar(max) =
N'select [Scancode], [Product Name],' + @stores +
N' from
(
select * from src
) X
pivot
(
SUM([Quantity])
for [Store Name] IN (' + @stores + N')
) as p'
exec sp_executesql @sql
答案 1 :(得分:0)
正如 MatBailie
指出的那样,Sybase缺少PIVOT
功能会迫使您将数据表示与数据检索分开。您的选择仅限于编写不可扩展的kludge或重组中间应用程序层中的数据。
我选择牺牲可扩展性以缺少中间应用层。
我的解决方案遵循this form:
SELECT
[Scancode],
[Product Name],
MAX( CASE WHEN STO_FK = 1 THEN net.Total ELSE 0 END ) AS 'Tokyo Sales',
MAX( CASE WHEN STO_FK = 2 THEN net.Total ELSE 0 END ) AS 'New York Sales',
MAX( CASE WHEN STO_FK = 3 THEN net.Total ELSE 0 END ) AS 'London Sales'
FROM Items
JOIN (
SELECT ITM_FK, STO_FK, SUM([Quantity]) AS Total
FROM Sales
JOIN Stores
ON Stores.PK = Sales.STO_FK
GROUP BY ITM_FK, STO_FK
) AS net
ON Items.PK = net.ITM_FK
GROUP BY
[Scancode],
[Product Name]