Sql server 如何在SQL Server中将行合并为一行

Sql server 如何在SQL Server中将行合并为一行,sql-server,merge,rows,Sql Server,Merge,Rows,我有一张这样的桌子: - ID | CurrencyID | LendID | Price - 3 | 1 | 1 | 1.2 - 3 | 1 | 2 | 1.3 - 3 | 1 | 3 | 1.4 - 3 | 2 | 1 | 1.5 - 3 | 2 | 2 | 1.6 - 3 | 2

我有一张这样的桌子:

 - ID  | CurrencyID | LendID |  Price
 - 3   |    1       |  1      |  1.2
 - 3   |    1       |  2      |  1.3
 - 3   |    1       |  3      |  1.4
 - 3   |    2       |  1      |  1.5
 - 3   |    2       |  2      |  1.6
 - 3   |    2       |  3      |  1.7
 - 4   |    2       |  3      |  2.0
总共有4种货币
1,2,3,4

总共有3个借出
1,2,3

我希望得到如下结果:

ID | CurrencyIDLendID_11_Price | CIDID_12_Price | CIDLID_13_Price | CIDLID_21_Price | CIDLID_22_Price | CIDLID_23_Price | CIDLID_31_Price | CIDLID_32_Price | CIDLID_33_Price | CIDLID_41_Price | CIDLID_42_Price | CIDLID_43_Price
 3 | 1.2 | 1.3 | 1.4 | 1.5 | 1.6 | 1.7 | 0 | 0 | 0 | 0 | 0 | 0
 4 |  0  |  0  |  0  |  0  |  0  | 2.0 | 0 | 0 | 0 | 0 | 0 | 0
我知道这是一个很好的描述,但我想做的是将多条记录合并到一条记录。

这称为数据透视,其中一种方法是使用分组和条件聚合:

WITH cidlid AS (
  SELECT
    ID,
    CurrencyIDLendID = CurrencyID * 10 + LendID,
    Price
  FROM atable
)
SELECT
  ID,
  CurrencyIDLendID_11_Price = COALESCE(SUM(CASE CurrencyIDLendID WHEN 11 THEN Price END), 0),
  CurrencyIDLendID_12_Price = COALESCE(SUM(CASE CurrencyIDLendID WHEN 12 THEN Price END), 0),
  CurrencyIDLendID_13_Price = COALESCE(SUM(CASE CurrencyIDLendID WHEN 13 THEN Price END), 0),
  CurrencyIDLendID_21_Price = COALESCE(SUM(CASE CurrencyIDLendID WHEN 21 THEN Price END), 0),
  CurrencyIDLendID_22_Price = COALESCE(SUM(CASE CurrencyIDLendID WHEN 22 THEN Price END), 0),
  CurrencyIDLendID_23_Price = COALESCE(SUM(CASE CurrencyIDLendID WHEN 23 THEN Price END), 0),
  CurrencyIDLendID_31_Price = COALESCE(SUM(CASE CurrencyIDLendID WHEN 31 THEN Price END), 0),
  CurrencyIDLendID_32_Price = COALESCE(SUM(CASE CurrencyIDLendID WHEN 32 THEN Price END), 0),
  CurrencyIDLendID_33_Price = COALESCE(SUM(CASE CurrencyIDLendID WHEN 33 THEN Price END), 0),
  CurrencyIDLendID_41_Price = COALESCE(SUM(CASE CurrencyIDLendID WHEN 41 THEN Price END), 0),
  CurrencyIDLendID_42_Price = COALESCE(SUM(CASE CurrencyIDLendID WHEN 42 THEN Price END), 0),
  CurrencyIDLendID_43_Price = COALESCE(SUM(CASE CurrencyIDLendID WHEN 43 THEN Price END), 0)
FROM cidlid
GROUP BY ID
如果所有的
(CurrencyID,LendID)
组合在相同的ID组中都是唯一的,那么您也可以使用MIN或MAX来代替SUM。

您可以使用从SQL Server 2005开始的语法

Declare @Data table (ID int, CurrencyID int, LendID int , price decimal (4,2))

INSERT INTO @Data

SELECT 3 as ID, 1 as CurrencyID, 1 as LendID , 1.2  as price
UNION SELECT 3   ,    1       ,  1      ,  1.2
UNION SELECT 3   ,    1       ,  2      ,  1.3
UNION SELECT 3   ,    1       ,  3      ,  1.4
UNION SELECT 3   ,    2       ,  1      ,  1.5
UNION SELECT 3   ,    2       ,  2      ,  1.6
UNION SELECT 3   ,    2       ,  3      ,  1.7
UNION SELECT 4   ,    2       ,  3      ,  2.0



SELECT 
    ID,
    COALESCE([1_1],0)  as CurrencyIDLendID_11_Price ,
    COALESCE([1_2],0)  as CIDID_12_Price  ,
    COALESCE([1_3],0)  as CIDLID_13_Price  ,
    COALESCE([2_1],0)  as CIDLID_21_Price  ,
    COALESCE([2_2],0)  as CIDLID_22_Price  ,
    COALESCE([2_3],0)  as CIDLID_23_Price  ,
    COALESCE([3_1],0)  as CIDLID_31_Price  ,
    COALESCE([3_2],0)  as CIDLID_32_Price  ,
    COALESCE([3_3],0)  as CIDLID_33_Price  ,
    COALESCE([4_1],0)  as CIDLID_41_Price  ,
    COALESCE([4_2],0)  as CIDLID_42_Price  ,
    COALESCE([4_3],0)  as CIDLID_43_Price  
 FROM (
 SELECT 
        ID,
        cast(CurrencyID as varchar) + '_' + CAST(lendID as varchar) ColumnHeader, 
        price FROM @Data ) src 
 PIVOT (SUM(price) for ColumnHeader IN 
        ([1_1], [1_2],[1_3], 
             [2_1], [2_2],[2_3],
             [3_1], [3_2],[3_3],
             [4_1], [4_2],[4_3])


 ) as pivottable
哪个输出

ID          CurrencyIDLendID_11_Price               CIDID_12_Price                          CIDLID_13_Price                         CIDLID_21_Price                         CIDLID_22_Price                         CIDLID_23_Price                         CIDLID_31_Price                         CIDLID_32_Price                         CIDLID_33_Price                         CIDLID_41_Price                         CIDLID_42_Price                         CIDLID_43_Price
----------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- --------------------------------------- ---------------------------------------
3           1.20                                    1.30                                    1.40                                    1.50                                    1.60                                    1.70                                    0.00                                    0.00                                    0.00                                    0.00                                    0.00                                    0.00
4           0.00                                    0.00                                    0.00                                    0.00                                    0.00                                    2.00                                    0.00                                    0.00                                    0.00                                    0.00                                    0.00                                    0.00

注意:我保留了您的列名

Hi。欢迎来到SO。请正确设置问题的格式。要设置代码或数据示例的格式,您可以编辑问题,选择代码并按{}按钮。我会这样做,但我在我的手机上我格式化了表格,但我完全不知道输出的实际意图是什么。几个小问题当OP需要零时,这输出为空,所以你必须添加一个合并。也仅适用于LendID<10的情况。例如,如果
CurrentID=1和LendID=11
那么
CurrencyIDLendID=21
的结果与
CurrentID=2和LendID=1的结果相同,但可能不正确。@Conrad:你完全正确,当然需要合并。我也同意另一点,但问题是货币和贷款的数量非常明确,所以我认为乘以10与乘以100或任何其他10的幂一样好。无论如何,基本思想应该是明确的。