我对SQL很新,我不知道该怎么做。
我有一个财务数据数据库,其中一列为[天]。我需要在其中添加一个新列,它将添加一个类别,其中天数分为(0,1-30,30-60等)。
在excel中,这看起来像这样= IF(A1> 90,“90-120”,IF(A1> 60,“60-90”.......)
最终数据库应如下所示:
Days | Category
29 | 0-30
91 | 90-120
0 | 0
.
.
.
提前谢谢
答案 0 :(得分:2)
您可以使用case
:
select days,
(case when days > 90 then '90-120' -- should this be >= ?
when days > 60 then '60-90' -- should this be >= ?
. . .
end) as Category
from t;
答案 1 :(得分:0)
完成SQL:
select Days,
(case when days > '90' then '91-120'
when days > '60' then '61-90'
when days > '30' then '31-60'
when days > '0' then '1-30' else '0' end
end) as Category
from t;
答案 2 :(得分:0)
如果您使用的是SQL Server 2012 +,则使用IIF
是另一种方法:
CREATE TABLE Numbers (Number INT );
INSERT INTO Numbers VALUES
(1),
(0),
(15),
(29),
(32),
(54),
(59),
(60),
(63),
(89),
(90),
(140);
SELECT IIF(Number BETWEEN 90 AND 120, '90-120',
IIF(Number BETWEEN 60 AND 89, '60-90',
IIF(Number BETWEEN 30 AND 59 , '30-60' ,
IIF(Number BETWEEN 1 AND 29, '1-30' ,
IIF(Number = 0, '0', 'OutRange'))))) AS Category
FROM Numbers;
答案 3 :(得分:0)
试试这个
create table #tmp ([Days] int)
insert into #tmp values (29)
insert into #tmp values (91)
insert into #tmp values (0)
insert into #tmp values (65)
SELECT
CASE WHEN [Days]=0 then CONVERT(VARCHAR(15),0)
ELSE CONVERT(VARCHAR(15),[Days]/30*30)+'-'+ CONVERT(VARCHAR(15),([Days]/30*30)+30) END AS Category
from #tmp
drop table #tmp
答案 4 :(得分:0)
select *,number/30, ltrim(number/30*30)+'-' +ltrim((number/30+1)*30) from #Numbers
+--------+---+-------+ | Number | | | +--------+---+-------+ | 1 | 0 | 0-30 | | 0 | 0 | 0-30 | | 15 | 0 | 0-30 | | 29 | 0 | 0-30 | | 32 | 1 | 30-60 | | 54 | 1 | 30-60 | | 59 | 1 | 30-60 | | 60 | 2 | 60-90 | | 63 | 2 | 60-90 | +--------+---+-------+
答案 5 :(得分:0)
您的困境的一个解决方案可能是插入一个新的数据库列,该列使用称为"计算列规范"进入你的桌子。
计算列规范是一种在更新行时可以计算数据库列值的方法。该值也可以选择性地保留在数据库中,以便在查询时不必在那时执行任何计算(仅在INSERT
上)。
我喜欢这个解决方案,因为您在查询数据时不必进行任何特殊计算。您可以使用简单的SELECT
来提取新的列数据。
您没有列出具体内容,因此我们假设您的数据库表名为[FinancialData]
,并且已在其中定义了一个名为[Days]
的列数字类型(int
,smallint
,tinyint
,decimal
,float
,money
,numeric
或{{1} })。
您可以按如下方式添加计算列:
real
注意单词" PERSISTED"在上面的SQL语句中。这是导致数据库表在插入或更改[Days]列时实际将计算值存储在数据库表中的原因。如果您不想存储该值,只需省略单词" PERSISTED"。
当通过执行上面的SQL语句将计算列添加到表中时,将为表中的所有现有行计算和存储值。在表中插入新行时,请不要为新的[Category]列提供值。这是因为a)它不会起作用,b)该列的值将从[Days]列值计算。
要从新列中检索数据,只需在ALTER TABLE [FinancialData] ADD
Category AS (CASE WHEN [Days] >= 90 THEN '90-120'
WHEN [Days] >= 60 THEN '60-90'
WHEN [Days] >= 30 THEN '30-60'
WHEN [Days] >= 1 THEN '1-30'
WHEN [Days] = 0 THEN '0'
END) PERSISTED;
语句中列出该列(或使用SELECT
):
*
需要注意的几点需要注意: 1)这是SQL Server特有的。大多数其他数据库引擎不支持此功能。 2)您没有说明SELECT [Days], [Category]
FROM [FinancialData];
列是否可以为空 - 如果是,则必须修改此解决方案以支持该列。