【问题标题】:SQL: Expand 1 Column into 3 on Summarize TableSQL:在汇总表上将 1 列扩展为 3
【发布时间】:2010-10-12 13:51:43
【问题描述】:

我正在编写一个程序来显示产品及其所在的商店。

到目前为止,我已经能够编写一个显示数据的 SQL 查询,如下所示:

Product    Availability
Milk       Store1
Candy      Store1
Eggs       Store1
Milk       Store2
Eggs       Store2
Candy      Store3
Eggs       Store3

是否有任何 SQL 查询可用于将产品分组到 Product 列并将它们所在的商店扩展为 3 列,如下所示?

Product  Store1  Store2  Store3
Milk     Yes     Yes     No
Candy    Yes     No      Yes
Eggs     Yes     Yes     Yes

【问题讨论】:

    标签: .net sql database grouping summary


    【解决方案1】:
    SELECT 
        Product,
        MAX(CASE WHEN Availability='Store1' THEN 'Yes' ELSE 'No' END) AS Store1,
        MAX(CASE WHEN Availability='Store2' THEN 'Yes' ELSE 'No' END) AS Store2,
        MAX(CASE WHEN Availability='Store3' THEN 'Yes' ELSE 'No' END) AS Store3
    FROM YourTable
    GROUP BY Product
    

    【讨论】:

    • 一个很好的解决方案,但在这个例子中受到商店数量的限制。如果出现新商店,则查询将需要更新。 @Martin:我们不能让它动态吗?
    • @Kangkan - 取决于 DBMS。 Access 有一个transform 运算符。 SQL Server 需要动态生成整个查询字符串。
    • 谢谢,马丁。由于数据库在 Access 中,我使用 IIf 而不是 CASE WHEN 并且它有效。
    • @Alex - 如果您需要在添加新商店时动态生成列,请查看 Access 中的 Transform Statement
    • @Kangkan - 商店的数量永远不会改变,所以这个查询就足够了。就这样我可能知道,是否有任何其他查询可以动态执行此操作[如任何数量的商店]?
    【解决方案2】:

    一个很常见的问题。你需要知道的词是pivot。在 StackOverflow 中搜索“pivot”或“cross tab”以找到大量讨论和示例。

    【讨论】:

      【解决方案3】:

      如今,大多数 RDBM 都支持枢轴。如果您指定了您正在使用的数据库,这将有很大帮助。一些例子:MSSQLpostgres (the crosstab function) 等等。

      【讨论】:

      • 复制粘贴失败。谢谢。
      【解决方案4】:

      假设您在运行查询之前不知道列名,this blog 提供了一个很好的解决方案(但要注意注入攻击)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-04-18
        • 1970-01-01
        • 2021-11-19
        • 1970-01-01
        • 2018-10-09
        • 1970-01-01
        • 2016-11-15
        • 2017-05-27
        相关资源
        最近更新 更多