我有一个场景,比如显示状态和计数。看下面的模型
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 中做到这一点?
添加一个“else”,如下所示:
SELECT CASE
WHEN Status= 'I' THEN 'IN PROGRESS'
WHEN Status= 'C' THEN 'COMPLETED'
ELSE 'Others'
END AS ' Status'
FROM table1
根据我的理解,您有一个包含状态值的主表,我将其简化为:
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;