SQL IF / CASE语句

时间:2017-11-28 17:28:12

标签: sql-server

我对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 
.
.
.

提前谢谢

6 个答案:

答案 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]的列数字类型(intsmallinttinyintdecimalfloatmoneynumeric或{{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]; 列是否可以为空 - 如果是,则必须修改此解决方案以支持该列。