(SQL)拆分一个表';根据值将列分为两列
我们所拥有的:(SQL)拆分一个表';根据值将列分为两列,sql,sql-server,Sql,Sql Server,我们所拥有的: Property Cost Car 2 0k Bike 10k House 500k Condo 250k Mobile-Home 90k 期望的: Property Cost Value Car 11-20k N/A Bike 0-10k N/A House N/A 251-500k Condo N/A 100-250k Mobile
Property Cost
Car 2 0k
Bike 10k
House 500k
Condo 250k
Mobile-Home 90k
期望的:
Property Cost Value
Car 11-20k N/A
Bike 0-10k N/A
House N/A 251-500k
Condo N/A 100-250k
Mobile-home N/A 21-90k
我在表中有一列“属性”和一列“成本”。我想为“成本”创建一个单独的列,我会给它一个别名作为“值”,并取决于显示为“属性”的内容,这也适用于我的“成本”列
我还需要完整的范围是两列的可能性
I.e 0-10k, 11-20k, 21-100k, 101-250k and 251-500k
我将如何编写此查询?使用MSSS。这回答了问题的原始版本 如果我理解正确,您需要
case
表达式:
select property,
(case when property in ('car', 'bike') then cost end) as cost,
(case when property not in ('car', 'bike') then cost end) as value
from t;
这回答了问题的原始版本 如果我理解正确,您需要
case
表达式:
select property,
(case when property in ('car', 'bike') then cost end) as cost,
(case when property not in ('car', 'bike') then cost end) as value
from t;
我将创建一个表“Properties”,其中包含列auto inc int Id、varchar(something)Name、bit IsCost not null
然后:
如果您怀疑这可能更进一步(成本/价值本质上不是一个布尔值),那么您可能需要添加一个IsValue列,或者创建一个指向引用propertyType(成本、价值、费用等)的不同表的列。我将创建一个表“Properties”,其中包含列auto inc int Id、varchar(某物)名称、,位IsCost不为空
然后:
如果您怀疑这可能更进一步(成本/价值本质上不是布尔值),那么您可能需要添加一个IsValue列,或者创建一个指向不同表的列,该表引用属性类型(成本、价值、费用等)。您可以使用滞后条件引入下一个成本的值:
;with tableA as
(select 'Car' as Property,'20K' as Cost union
select 'Bike','10K' union
select 'House','500K' union
select 'Condo','250K' union
select 'Mobile-Home','90K')
select a.Property,
case when property in ('car', 'bike')
then ISNULL(LAG(Cost) Over (Order by CAST(Replace(a.Cost,'K','') as int)),'0K') + ' - ' + Cost
else 'N/A'
end as cost,
case when property not in ('car', 'bike')
then ISNULL(LAG(Cost) Over (Order by CAST(Replace(a.Cost,'K','') as int)),'0K') + ' - ' + Cost
else 'N/A'
end as value
from tableA a
我还将空值替换为“不适用”。希望这有帮助。您可以使用滞后条件来引入下一个成本的价值:
;with tableA as
(select 'Car' as Property,'20K' as Cost union
select 'Bike','10K' union
select 'House','500K' union
select 'Condo','250K' union
select 'Mobile-Home','90K')
select a.Property,
case when property in ('car', 'bike')
then ISNULL(LAG(Cost) Over (Order by CAST(Replace(a.Cost,'K','') as int)),'0K') + ' - ' + Cost
else 'N/A'
end as cost,
case when property not in ('car', 'bike')
then ISNULL(LAG(Cost) Over (Order by CAST(Replace(a.Cost,'K','') as int)),'0K') + ' - ' + Cost
else 'N/A'
end as value
from tableA a
我还将空值替换为“不适用”。希望这能有所帮助。我将对两个表执行简单的联接 不太清楚如何在最终结果的成本和价值之间进行切换 示例
Declare @Table1 Table ([Property] varchar(50),[Cost] varchar(50)) Insert Into @Table1 Values
('Car','20k')
,('Bike','10k')
,('House','500k')
,('Condo','250k')
,('Mobile-Home','90k')
Declare @Table2 Table ([Title] varchar(50),[R1] varchar(50),[R2] varchar(50)) Insert Into @Table2 Values
('0-10k',0,10)
,('11-20k',11,20)
,('21-100k',21,100)
,('101-250k',101,250)
,('251-500k',251,500)
Select A.Property
,Cost = IsNull(B.Title ,'N/A')
,Value = IsNull(C.Title ,'N/A')
From @Table1 A
Cross Apply (values (try_convert(money,replace(Cost,'K',''))) )V(amt)
Left Join @Table2 B on amt between B.R1 and B.R2 and amt<=20
Left Join @Table2 C on amt between C.R1 and C.R2 and amt> 20
我将在两个表上执行简单的联接 不太清楚如何在最终结果的成本和价值之间进行切换 示例
Declare @Table1 Table ([Property] varchar(50),[Cost] varchar(50)) Insert Into @Table1 Values
('Car','20k')
,('Bike','10k')
,('House','500k')
,('Condo','250k')
,('Mobile-Home','90k')
Declare @Table2 Table ([Title] varchar(50),[R1] varchar(50),[R2] varchar(50)) Insert Into @Table2 Values
('0-10k',0,10)
,('11-20k',11,20)
,('21-100k',21,100)
,('101-250k',101,250)
,('251-500k',251,500)
Select A.Property
,Cost = IsNull(B.Title ,'N/A')
,Value = IsNull(C.Title ,'N/A')
From @Table1 A
Cross Apply (values (try_convert(money,replace(Cost,'K',''))) )V(amt)
Left Join @Table2 B on amt between B.R1 and B.R2 and amt<=20
Left Join @Table2 C on amt between C.R1 and C.R2 and amt> 20
正是我将使用的解决方案,对OP的请求有着相同的解释。我刷新了我的问题,因为它不是我需要的答案,因为我遇到了其他问题。。。不幸的是,这一编辑会破坏格式,你能回顾并回答吗?正是我将使用的解决方案,与OP的请求具有相同的解释。我刷新了我的问题,因为它不完全是我需要的答案,因为我遇到了其他问题。。。不幸的是,这个编辑会破坏格式,你能回顾并回复吗?我会重新访问db模型。除了了解/浏览文本外,是否有标志表示什么应该是成本,什么应该是价值?根据我收集到的您需要的信息,我能想到的最佳布局是创建3个表:带有[Id]、[Name]的[Property]表,带有[Id]、[PropertyId]、[Cost]的[Cost]表,最后是带有[Id]、[PropertyId]、[Value]的[Value]表。然后,您可以使用视图一次显示所有数据,因为您无法仅根据一个数字可靠地区分“成本”和“价值”。昂贵的汽车很容易比房子贵。条件差的房产很容易比房子便宜。成本(而非价格)也是一个历史事实,是根据购买时的“价值”设定的。让我们希望这只是一个关于使用CASE表达式的测试-这不是一个应该在实际生产系统中实现的逻辑。有人知道如何编辑问题,使其读起来更清晰,就像我最初上传的一样吗?我不知道为什么所有的格式都没有翻译过来:(我会重新访问db模型。除了了解/浏览文本外,是否有一个标志来表示什么应该是成本,什么应该是价值?我能想到的最好的布局是创建3个表:一个带有[Id]、[Name]的[Property]表,一个带有[cost]的[cost]表[Id]、[PropertyId]、[Cost],最后是一个带有[Id]、[PropertyId]、[Value]的[Value]表。然后,您可以使用一个视图一次显示所有数据。您无法仅根据一个数字就可靠地区分“成本”和“价值”。昂贵的汽车很容易比房子贵。状况不佳的房产很容易比房子便宜。成本(不是价格)也是基于“价值”设定的历史事实购买时。我们希望这只是一个使用案例表达式的测试-这不是在实际生产系统中应该实现的逻辑。有人知道如何编辑问题,使其阅读更清晰,因为我最初上传了它?我不知道为什么没有翻译格式:(