我试图打破并合并这样的表的结果。 (对于宾果游戏!)我可以轻松地编写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 | -- | -- |
答案 0 :(得分:3)
;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
答案 1 :(得分: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
<强> PIVOT:强>
或者,由于您使用的是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