如何编写带Join与Count的SQL查询统计项目各状态库存数量
实现方案
你需要的按不同状态分别统计库存的功能可以通过条件聚合实现:在COUNT聚合函数内部嵌套CASE WHEN做状态判断,匹配到对应状态时返回有效值参与计数,不匹配时返回NULL不会被COUNT统计,正好符合分状态计数的需求。
完整SQL示例
SELECT p.Name AS 项目名称, p.Street AS 地址, p.City AS 城市, p.State AS 省份, p.Country AS 国家, p.CreateDate AS 创建日期, COUNT(CASE WHEN s.Status = 'Available' THEN 1 END) AS Available, COUNT(CASE WHEN s.Status = 'Reserved' THEN 1 END) AS Reserved, COUNT(CASE WHEN s.Status = 'Sold' THEN 1 END) AS Sold FROM project p LEFT JOIN stock s ON p.Id = s.ProjectID WHERE p.CreateDate > '2016-01-01' AND p.Postcode IN ('你指定的邮编1', '你指定的邮编2', '...') -- 替换为实际邮编列表 GROUP BY p.Id, p.Name, p.Street, p.City, p.State, p.Country, p.CreateDate
注意事项
- 上述写法是标准SQL语法,兼容所有主流数据库(MySQL、PostgreSQL、SQL Server、Oracle等)。
- 这里使用
LEFT JOIN是为了保留没有对应库存数据的项目,如果不需要展示无库存的项目,可以替换为INNER JOIN。 - MySQL环境下可以简化写法为
SUM(s.Status = 'Available') AS Available,利用布尔判断返回1/0求和的结果和计数一致,语法更简洁但不具备跨数据库兼容性。 GROUP BY需包含所有SELECT子句中未参与聚合的字段,符合SQL规范要求,避免部分严格模式的数据库报错。
内容的提问来源于stack exchange,提问作者Iryna
相关产品推荐
相关产品推荐

