sql - SQL 只返回带有数据的行,而不是那些为 0 的行
问题描述
我正在尝试报告有多少项目处于特定状态。我得到的代码只返回有值的行,而不返回没有值的行。
SELECT Department
,Status
,count(Department) AS "Number in status"
,convert(VARCHAR, getdate(), 103) AS "Date report ran"
FROM [Server name].[xxx].[Database name]
WHERE STATUS NOT IN (
'Closed'
,'Cancelled'
)
AND Department IN (
'Department name'
)
GROUP BY Department,Status
ORDER BY CASE
WHEN STATUS = 'Open'
THEN 1
WHEN STATUS = 'In Progress'
THEN 2
WHEN STATUS = 'Authorised'
THEN 3
WHEN STATUS = 'Awaiting Auth'
THEN 4
WHEN STATUS = 'Awaiting Collection'
THEN 5
WHEN STATUS = 'Awaiting Delivery'
THEN 6
WHEN STATUS = 'Awaiting Development'
THEN 7
WHEN STATUS = 'Awaiting Engineer'
THEN 8
WHEN STATUS = 'Awaiting Invoice/Credit'
THEN 9
WHEN STATUS = 'Awaiting Quote'
THEN 10
WHEN STATUS = 'Cancelled'
THEN 11
WHEN STATUS = 'Chase End User'
THEN 12
WHEN STATUS = 'Final Chase End User'
THEN 13
WHEN STATUS = 'Closed'
THEN 14
WHEN STATUS = 'Future Requirements'
THEN 15
WHEN STATUS = 'In Test'
THEN 16
WHEN STATUS = 'Next Release'
THEN 17
WHEN STATUS = 'On Hold'
THEN 18
WHEN STATUS = 'With End-User'
THEN 22
WHEN STATUS = 'With IIT'
THEN 23
WHEN STATUS = 'Processing Via Demand Management'
THEN 27
END;
结果如下,但它不包括可能具有 0 值的所有其他状态:
+-----------------+----------------------------------+----+------------+
| | | | |
+-----------------+----------------------------------+----+------------+
| Department name | Open | 92 | 29/03/2019 |
| Department name | In Progress | 9 | 29/03/2019 |
| Department name | Awaiting Development | 4 | 29/03/2019 |
| Department name | Future Requirements | 1 | 29/03/2019 |
| Department name | In Test | 7 | 29/03/2019 |
| Department name | On Hold | 15 | 29/03/2019 |
| Department name | With End-User | 28 | 29/03/2019 |
| Department name | With IIT | 2 | 29/03/2019 |
| Department name | Processing Via Demand Management | 2 | 29/03/2019 |
+-----------------+----------------------------------+----+------------+
解决方案
您需要一个状态表,其中至少包含状态描述和(可能)报告顺序:
CREATE TABLE Statuses (
Status varchar(30) not null,
ReportOrder int not null,
ShowInReport bit not null,
constraint PK_Statuses (Status)
)
现在您可以使用LEFT JOIN
从该表到其他未命名表的查询来编写查询(因为您的查询当前声称正在查询数据库而不是其FROM
子句中的表:
SELECT Department
,s.Status
,count(Department) AS "Number in status"
,convert(VARCHAR, getdate(), 103) AS "Date report ran"
FROM
Statuses s
left join
unnamedTable t
on
s.Status = t.Status
WHERE s.ShowInReport = 1
AND Department IN (
'Department name'
)
GROUP BY Department,s.Status
ORDER BY s.ReportOrder
Departments
如果您仍然希望0
行的输出中的部门名称与上述非常相似,那么拥有一个表也可能是谨慎的:
...
FROM
Statuses s
cross join
Departments d
left join
unnamedTable t
on
s.Status = t.Status and
d.Department = t.Department
...
(您还应该在未命名表之间有一个 FK,并Statuses
确保其中使用的所有状态值都是有效的)
推荐阅读
- r - rollapply lm时可变长度不同错误
- android - 无法捕获 ExoPlaybackException:源错误
- kibana - 如何在 Kibana 的侧边栏更改标题?
- swift - 用户是否可以使用此数据库检索方法访问敏感数据?
- javascript - 使用 Dragula 拖放保存拖动项目的位置
- spring-boot - 是否可以使用 Web Flux Spring 集成创建队列侦听器?
- java - 如何在 log4j2 中编写自定义标头
- java - 如何解决在spring boot中执行ddl命令的错误
- javascript - Reactjs:如何创建音量计
- ios - Xcode iOS Release 版本不断归档旧版本的 React 本机应用程序