如何在 SQL Server case 语句中设置默认值?

问题描述 投票:0回答:2

我有一个场景,比如显示状态和计数。看下面的模型

Status            Counts
---------------   --------
Completed          10
In Progress         6
Others              0

我有这个代码:

SELECT 
    CASE 
       WHEN Status = 'I' THEN 'IN PROGRESS' 
       WHEN Status = 'O' THEN 'Others' 
       WHEN Status = 'C' THEN 'COMPLETED' 
    END AS ' Status', 
    COUNT(Status) AS ' Counts' 
FROM   
    table1

我只有

Completed
InProgress
的值。目前我只得到两行。但我需要三行,包括
Others
并且它的计数应该为 0 - 如何在 SQL 中做到这一点?

sql-server
2个回答
16
投票

添加一个“else”,如下所示:

SELECT CASE 
    WHEN Status= 'I' THEN 'IN PROGRESS' 
    WHEN Status= 'C' THEN 'COMPLETED' 
    ELSE 'Others' 
END AS ' Status'
FROM table1

1
投票

根据我的理解,您有一个包含状态值的主表,我将其简化为:

CREATE TABLE #MainTable
(
    id INT,
    [status] NVARCHAR(1)
)

您的问题是,如果

O
没有状态为
Others
的行,则当您对行进行分组以获取计数时,您不会获得
0

我建议您创建一个

Status
表来链接到
RIGHT JOIN
。这也将消除您对
CASE
声明的需要。

完整解决方案:

CREATE TABLE #MainTable
    (
      id INT ,
      [status] NVARCHAR(1)
    );

INSERT  INTO #MainTable
        ( id, [status] )
VALUES  ( 1, 'I' ),
        ( 2, 'I' ),
        ( 3, 'I' ),
        ( 4, 'I' ),
        ( 5, 'C' ),
        ( 6, 'C' );

CREATE TABLE #status
    (
      [status] NVARCHAR(1) ,
      [statusText] NVARCHAR(15)
    );

INSERT  INTO #status
        ( status, statusText )
VALUES  ( 'I', 'In Progress' ),
        ( 'C', 'Completed' ),
        ( 'O', 'Others' );

SELECT  s.statusText ,
        COUNT(t.[status]) StatusCount
FROM    #MainTable t
        RIGHT JOIN #status s ON s.status = t.status
GROUP BY s.statusText;

DROP TABLE #MainTable;
DROP TABLE #status;

产品:

statusText  StatusCount
Completed   2
In Progress 4
Others      0

在上面的示例中,它连接到

I,O,C
字符串值,我建议您将其替换为
ID
值。那么你可以这样做:

CREATE TABLE #MainTable
    (
      id INT ,
      statusId INT
    );

CREATE TABLE #status
    (
      statusId INT ,
      statusShort NVARCHAR(1) ,
      statusText NVARCHAR(15)
    );

SELECT t.id ,
       t.statusId ,
       s.statusId ,
       s.statusShort ,
       s.statusText 
FROM #MainTable t
RIGHT JOIN #status s ON s.statusId = t.statusId

DROP TABLE #MainTable;
DROP TABLE #status;
© www.soinside.com 2019 - 2024. All rights reserved.