【问题标题】:Combining Multiple Rows into one row with separate columns将多行合并为一行,并具有单独的列
【发布时间】:2014-09-04 15:03:11
【问题描述】:

我正在尝试编写一个查询,其中我加入的一个表可能包含每个唯一 ID 的多行。我想在我的结果中合并这些行,以便每个唯一 ID 只有一行。

请看下面的简化示例:

Tender表:

ID     | TenderType    |  TenderAmount 
----------------------------------------
4567   | Cash          |  40.00
4568   | Cash          |  22.00
4568   | Visa          |  86.00
4568   | Gift Card     |  10.00
4570   | Cash          |  66.00
4570   | MC            |  30.00

期望的结果:

ID   | TenderType1 | TenderType2 | TenderType3 | TenderAmount1 | TenderAmount2 | TenderAmount3 |
------------------------------------------------------------------------------------------------
4567 | Cash        |             |             | 40.00         |               |               |
4568 | Cash        | Visa        | Gift Card   | 22.00         | 86.00         | 10.00         |
4570 | Cash        | MC          |             | 66.00         | 30.00         |               |

我正在使用 SQL Server 2005。任何帮助都会很棒。

【问题讨论】:

  • 我很喜欢这句话:“我要加入的表中的一个可能包含每个唯一 ID 的多行”。如果重复,则 ID 不是唯一。 (不过我知道你的意思。)
  • 哈!我明白这怎么可能被误读。在原始表中,该值不会是唯一的,但在我的查询中(希望)它会是唯一的。

标签: sql sql-server sql-server-2005


【解决方案1】:

这是一个“枢轴”。你应该看看如何做数据透视表。

【讨论】:

    【解决方案2】:

    使用 SQL Pivot 来完成此操作。此链接中的说明和示例:

    http://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx

    【讨论】:

      【解决方案3】:
      ;WITH CashCTE AS
      (
          SELECT ID, 
                 TenderType,
                 TenderAmount
          FROM   Tender
          WHERE  TenderType = 'Cash'
      ),GiftCardCTE AS
      (
          SELECT ID, 
                 TenderType,
                 TenderAmount
          FROM   Tender
          WHERE  TenderType = 'Gift Card'
      ),CreditCardCTE AS
      (
          SELECT ID, 
                 TenderType,
                 TenderAmount
          FROM   Tender
          WHERE  TenderType IN ('Visa','MC')
      )
      
      SELECT COALESCE(C.ID,G.ID,V.ID) AS ID,
             C.TenderType AS TenderType1,
             V.TenderType AS TenderType2,
             G.TenderType AS TenderType3,
             C.TenderAmount AS TenderAmount1,
             V.TenderAmount AS TenderAmount2,
             G.TenderAmount AS TenderAmount3
      FROM   CashCTE C
             FULL OUTER JOIN GiftCardCTE G
                 ON C.ID = G.ID
             FULL OUTER JOIN CreditCardCTE V
                 ON C.ID = V.ID
      

      SQL Fiddle Demo

      【讨论】:

        猜你喜欢
        • 2021-03-31
        • 2018-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多