使用SQL以列方式检索行方式数据

时间:2014-03-23 20:46:04

标签: sql tsql join sybase

我在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意味着可以在不修改查询的情况下添加更多商店。

2 个答案:

答案 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]