Sql 如何将一列拆分为两列?
我在微软SQL Server管理工作室工作 我有一个专栏叫Car,它有两个不同的行值Volvo和BMW。如何将此列拆分为两列,例如:Car1和Car2。然后将沃尔沃的所有行值存储在Car1列中,然后将宝马的值存储在Car2列中 看起来是这样的:Sql 如何将一列拆分为两列?,sql,sql-server,Sql,Sql Server,我在微软SQL Server管理工作室工作 我有一个专栏叫Car,它有两个不同的行值Volvo和BMW。如何将此列拆分为两列,例如:Car1和Car2。然后将沃尔沃的所有行值存储在Car1列中,然后将宝马的值存储在Car2列中 看起来是这样的: +-------+ | Car | +-------+ | Volvo | | Volvo | | Volvo | | BMW | | BMW | | Volvo | | BMW | +-------+ +-------+------+
+-------+
| 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这个答案与要求的结果不一样。它还表明,任何不是沃尔沃的汽车都是宝马