【问题标题】:SQL Merging RowsSQL 合并行
【发布时间】:2013-01-12 08:52:51
【问题描述】:

我试图打破和合并这样的表格的结果。 (对于宾果游戏!)我可以很容易地编写 CASE 以按第一个字母将列分开。但是,我最终会显示空值,因为行被它们的 ID 视为不同。我在这里尝试了一些合并示例,但似乎被难住了。 ID 无关紧要,我可以控制如何收集初始数据。

ID  |  Number     |
====================
1   |      N6     | 
2   |      B22    |
3   |      B5     |
4   |      I9     |
5   |      N4     |


B  |  I  |  N  |  G  |  O  |
============================
B5 |  I9 | N4  |  -- | --  |
B22| --  | N6  |  -- | --  |

【问题讨论】:

  • 你用的是什么关系型数据库?
  • 这是 SQL 2008 SP1。我还没有真正起作用的 select 语句:/ 至少那是我所追求的。

标签: sql sql-server-2008 merge pivot aggregate-functions


【解决方案1】:

这种类型的数据转换是pivot。您可以通过多种方式旋转数据。

聚合案例:这使用case 表达式和聚合函数来创建列

select 
  max(case when letter = 'b' then number end) B,
  max(case when letter = 'i' then number end) I,
  max(case when letter = 'n' then number end) N,
  max(case when letter = 'g' then number end) G,
  max(case when letter = 'o' then number end) O
from
(
  select left(number, 1) letter,
    number,
    row_number() over(partition by left(number, 1) 
                     order by cast(substring(number, 2, 2) as int)) rn
  from yourtable
) src
group by rn
order by rn

SQL Fiddle with Demo

枢轴:

或者由于您使用的是 SQL Server 2005+,您可以使用 PIVOT 函数:

select b, i, n, g, o
from
(  
  select left(number, 1) letter,
    number,
    row_number() over(partition by left(number, 1) 
                      order by cast(substring(number, 2, 2) as int)) rn
  from yourtable
) src
pivot
(
  max(number)
  for letter in (b, i, n, g, o)
) piv

SQL Fiddle with Demo

【讨论】:

  • PIVOT 的好例子 - 更好的解决方案 IMO
【解决方案2】:
;WITH CTE AS
(
SELECT *,
       LEFT([Number],1) AS Letter,
       ROW_NUMBER() OVER (PARTITION BY LEFT([Number],1) 
                              ORDER BY CAST(SUBSTRING([Number],2,2) AS INT) ) AS RN
FROM Table1
)
SELECT 
    MAX(CASE WHEN Letter = 'B' THEN [Number] END) AS B,
    MAX(CASE WHEN Letter = 'I' THEN [Number] END) AS I,
    MAX(CASE WHEN Letter = 'N' THEN [Number] END) AS N,
    MAX(CASE WHEN Letter = 'G' THEN [Number] END) AS G,
    MAX(CASE WHEN Letter = 'O' THEN [Number] END) AS O
FROM CTE
GROUP BY RN

SQL Fiddle

【讨论】:

    猜你喜欢
    • 2021-06-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-25
    相关资源
    最近更新 更多