【问题标题】:SQL Challenge concatenate rows to the end of every groupSQL Challenge 将行连接到每个组的末尾
【发布时间】:2021-09-18 11:24:57
【问题描述】:

我有下表,我需要展平数据。

从这里

表 1

id      val1   val2   ....valn 
-----------------------------------
1         a      z
1         b      x
1         c      v 
2         a      w
2         b      q 
..n

到这里

id      val1_1   val2_1   ....valn_1   val1_2  val2_2 ... valn_2  ....  val1_n...valn_n 
-----------------------------------
1         a      z                        b       x
2         a      w                        b       q 
..n

有什么想法吗?

我已经使用游标做了一些事情,但是它有点讨厌并且它有一些错误。枢轴?

【问题讨论】:

    标签: sql-server database tsql pivot cursors


    【解决方案1】:

    是的,您需要一个枢轴,但您还需要计算一个行号以进行枢轴。但是,鉴于这是一个多列数据透视,使用条件聚合可能更容易。

    我建议你为行号选择一个正确的顺序

    SELECT
      id,
      val1_1 = MAX(CASE WHEN t.rn = 1 THEN t.val1 END),
      val2_1 = MAX(CASE WHEN t.rn = 1 THEN t.val2 END),
      val3_1 = MAX(CASE WHEN t.rn = 1 THEN t.val3 END),
    --  ...........
      val1_2 = MAX(CASE WHEN t.rn = 2 THEN t.val1 END),
      val2_2 = MAX(CASE WHEN t.rn = 2 THEN t.val2 END),
      val3_2 = MAX(CASE WHEN t.rn = 2 THEN t.val3 END),
    --  ...........
    FROM (
        SELECT *,
            rn = ROW_NUMBER() OVER (PARTITION BY t.rn ORDER BY (SELECT 1))
        FROM table1 t
    ) t
    GROUP BY t.id;
    

    【讨论】:

    • CREATE TABLE #table1 (id int, val1 varchar(10), val2 VARCHAR (10) ) INSERT INTO #table1 VALUES (1, 'a', 'z'), (1, 'b ', 'x'), (1, 'c', 'v'), (2, 'a', 'w'), (2, 'b', 'q') SELECT id, val1_1 = MAX(CASE当 t.rn = 1 THEN t.val1 END), val2_1 = MAX(CASE WHEN t.rn = 1 THEN t.val2 END), val1_2 = MAX(CASE WHEN t.rn = 2 THEN t.val1 END), val2_2 = MAX(CASE WHEN t.rn = 2 THEN t.val2 END) FROM (SELECT *, rn = ROW_NUMBER() OVER (PARTITION BY t.id ORDER BY (SELECT 1)) FROM #table1 t) t GROUP BY t。 ID;谢谢:D
    猜你喜欢
    • 2013-06-22
    • 1970-01-01
    • 2021-08-30
    • 1970-01-01
    • 2012-05-06
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 2015-03-20
    相关资源
    最近更新 更多