我是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
答案 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
答案 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