(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]表。然后,您可以使用一个视图一次显示所有数据。您无法仅根据一个数字就可靠地区分“成本”和“价值”。昂贵的汽车很容易比房子贵。状况不佳的房产很容易比房子便宜。成本(不是价格)也是基于“价值”设定的历史事实购买时。我们希望这只是一个使用案例表达式的测试-这不是在实际生产系统中应该实现的逻辑。有人知道如何编辑问题,使其阅读更清晰,因为我最初上传了它?我不知道为什么没有翻译格式:(