【问题标题】:Return multiple row's column values as columns of linked item返回多行的列值作为链接项的列
【发布时间】:2013-01-19 17:11:44
【问题描述】:

我有一个(简化的)表格,其结构如下:

Table: ItemData

PK | ScanCode | StoreFK | Retail | ReceiptAlias
1  | 100101   | 1       | 4.99   | Milk
4  | 100101   | 2       | 4.99   | Milk
7  | 100101   | 3       | 0.99   | Milk
2  | 100102   | 1       | 6.99   | Eggs
5  | 100102   | 2       | 6.99   | Eggs
8  | 100102   | 3       | 6.99   | Eggs
3  | 100103   | 1       | 7.99   | Bread
6  | 100103   | 2       | 8.99   | Bread
9  | 100103   | 3       | 9.99   | Bread

我可以使用以下 SQL 查询获得以下返回结果,其中显示了在一个或多个商店具有不同零售的所有商品:see this previously asked question

SQL 查询:

SELECT   im.INV_ScanCode     AS ScanCode,
         name.ItemData AS im
GROUP BY ScanCode, Receipt_Alias
HAVING   COUNT(DISTINCT im.Retail) > 1
ORDER BY ScanCode

当前返回结果:

ScanCode | Receipt_Alias 
100101   | Milk
100103   | Bread

我想退回所有在一家或多家商店零售店不同的商品并且每个商店位置的零售店:

期望的回报结果:

ScanCode | Receipt_Alias | Str_1 | Str_2 | Str_3
100101   | Milk          | 4.99  | 4.99  | 0.99
100103   | Bread         | 7.99  | 8.99  | 9.99

如何更改我的 SQL 查询以包含每个商店位置的零售?

【问题讨论】:

  • 您希望将行转置为列(枢轴)。如果可能,您应该尝试在应用程序级别执行此操作。

标签: sql tsql sybase


【解决方案1】:
SELECT  ScanCode as ItemID,
        ReceiptAlias,
        MAX(CASE WHEN StoreFK = 1 THEN Retail ELSE NULL END) Store_1,
        MAX(CASE WHEN StoreFK = 2 THEN Retail ELSE NULL END) Store_2,
        MAX(CASE WHEN StoreFK = 3 THEN Retail ELSE NULL END) Store_3
FROM    ItemData
GROUP   BY ScanCode, ReceiptAlias
HAVING  COUNT(DISTINCT Retail) > 1

【讨论】:

  • 这将返回所有商品,而不仅仅是在一个或多个商店位置零售不同的商品。请参阅其他 SO 问题的链接。
  • 为了防止返回错误,我把ELSE NULL END改成了ELSE 0 END。我建议未来的读者也这样做!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-15
  • 1970-01-01
  • 1970-01-01
  • 2011-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多