Sql 如何将一列拆分为两列?

Sql 如何将一列拆分为两列?,sql,sql-server,Sql,Sql Server,我在微软SQL Server管理工作室工作 我有一个专栏叫Car,它有两个不同的行值Volvo和BMW。如何将此列拆分为两列,例如:Car1和Car2。然后将沃尔沃的所有行值存储在Car1列中,然后将宝马的值存储在Car2列中 看起来是这样的: +-------+ | Car | +-------+ | Volvo | | Volvo | | Volvo | | BMW | | BMW | | Volvo | | BMW | +-------+ +-------+------+

我在微软SQL Server管理工作室工作

我有一个专栏叫Car,它有两个不同的行值Volvo和BMW。如何将此列拆分为两列,例如:Car1和Car2。然后将沃尔沃的所有行值存储在Car1列中,然后将宝马的值存储在Car2列中

看起来是这样的:

+-------+
|  Car  |
+-------+
| Volvo |
| Volvo |
| Volvo |
| BMW   |
| BMW   |
| Volvo |
| BMW   |
+-------+
+-------+------+
| Car1  | Car2 |
+-------+------+
| Volvo | BMW  |
| Volvo | BMW  |
| Volvo | BMW  |
| Volvo |      |
+-------+------+
但我希望它看起来像这样:

+-------+
|  Car  |
+-------+
| Volvo |
| Volvo |
| Volvo |
| BMW   |
| BMW   |
| Volvo |
| BMW   |
+-------+
+-------+------+
| Car1  | Car2 |
+-------+------+
| Volvo | BMW  |
| Volvo | BMW  |
| Volvo | BMW  |
| Volvo |      |
+-------+------+
我尝试了一些关于子字符串、CHARINDEX等的方法。。。但是我现在完全被卡住了。

你可以试试这个

;with cte as
(
select case when car='volvo' then 'volvo' else 'BMW' end as bekar from t 
)

select case when bekar='volvo' then 'volvo' else '' end as Car1,
        case when bekar='BMW' then 'BMW' else '' end as Car2
from cte

这就是你要的。这真的是你想要的吗?此解决方案也适用于2个以上的汽车标签

;with x as
(
select distinct car, dense_rank() over (order by car desc) rn from car
)
select @carlist = coalesce(@carlist + ',[' + car+']', +'['+ car+']'),
       @carlist2 = coalesce(@carlist2 +','+ car + ' Car' + cast(rn as varchar(4)), car + ' Car1')
  from x
  order by rn

declare @sql varchar(max)=
';with x as
(
 SELECT car, row_number() over (partition by car order by car) rn
 FROM car
 )
SELECT '+@carlist2+'
FROM  
x 
PIVOT (max(car) FOR [car] IN ('+@carlist+')) AS pvt'

exec(@sql)
结果:

Car1  Car2
Volvo BMW
Volvo BMW
Volvo BMW
Volvo NULL

你为什么要做这样的事?嘿,欢迎你这么做。通常情况下,我们希望您包括对您的情况的详细描述,并包括您尝试的解决方案。具体说明你的问题。目前,你的问题只是一个相当模糊的问题。尽管这是一个奇怪的要求,但它是一个有效的问题,提供了数据和表格。问题是,编写一个查询尝试来解决这个问题并不容易。不公平的否决票。@zahorak你为什么在乎?如果最后一张表是SELECT*建议的全部交易,那么第二排沃尔沃是多余的。-1这个答案与要求的结果不一样。它还表明,任何不是沃尔沃的汽车都是宝马