如何在SQL Server select语句中将单个列拆分为多个列?

时间:2015-04-15 14:12:27

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

我是SQL Server新手。我有一个长列,名称从a,b,c和d开始。我想在NameA,NameB,NameC和NameD的单独列中显示它们。我试过联盟,但它在一栏中显示。我试过案例,但我不知道如何使用它。请帮忙。

现有专栏

names
A1
B1
A2
C1
A3
A4

A_names| B_names | C_names
A1     | B1      | C1
A2
A3
A4

5 个答案:

答案 0 :(得分:4)

只是为了好玩和好奇为什么你想要那个:

select * 
from 
( select idx = left(names,1)
       , names
       , rn = row_number() over (partition by left(names,1) order by names) 
  from 
  ( values ('A1'),('B1'),('A2'),('C1'),('A3'),('A4'),('B2')) 
  v(names)
) dat
pivot 
( max(names)
  for idx in ([A],[B],[C],[D])
) p              

http://sqlfiddle.com/#!6/9eecb/4013/0

答案 1 :(得分:3)

我不认为这是应该在SQL中解决的问题。它应该是在应用程序中完成的代表性事物。

但是,如果您坚持使用SQL,那么就是这样做的。此查询的主要问题是ROW_NUMBER函数对性能非常不利。

WITH nameA
(
   SELECT name, ROW_NUMBER() OVER(ORDER BY name) AS rn
   FROM t1
   WHERE name LIKE 'a%'
), nameB AS
(
   SELECT name, ROW_NUMBER() OVER(ORDER BY name) AS rn
   FROM t1
   WHERE name LIKE 'b%'
)
SELECT name FROM nameA
FULL OUTER JOIN nameB
ON nameA.rn = nameB.rn
ORDER BY nameA.rn,nameB.rn;

答案 2 :(得分:1)

您可以使用CASE(https://msdn.microsoft.com/en-us/library/ms181765.aspx

此查询应该有效:

SELECT 
    CASE WHEN users.name like 'a%' THEN users.name  ELSE NULL END AS NameA,
    CASE WHEN users.name like 'b%' THEN users.name  ELSE NULL END AS NameB,
    CASE WHEN users.name like 'c%' THEN users.name  ELSE NULL END AS NameC,
    CASE WHEN users.name like 'd%' THEN users.name  ELSE NULL END AS NameD
FROM users

答案 3 :(得分:1)

这不是关系数据库的工作方式。当您在同一行中有数据时,它应该以某种方式相关 - 至少是一个共同的ID。什么是将名称恰好以A开头的人与名字恰好以B开头的人联系起来?你为什么要让RDBMS进行这样的任意连接?

如果您要求以这种方式显示用户,您只需要编写多个查询并让您的表示层处理正确的问题,例如。

SELECT name FROM users WHERE name LIKE 'a%'
SELECT name FROM users WHERE name LIKE 'b%'
SELECT name FROM users WHERE name LIKE 'c%'
etc...

表示层可以运行每个查询,然后适当地填充表。更好的方法是让表示层只运行此查询:

SELECT name FROM users

然后适当地排序和显示数据,这可能比SQL Server对用户表上的多次扫描要便宜。

答案 4 :(得分:0)

看看这篇文章,它非常接近你的问题。 Itzik Ben-Gan | SQL Server Pro