我有一个表交付管理,有交付状态“Delivered”和“Pending”。我想要每个记录的总数。 我需要以下格式的答案
|Deliverd | Pending|
-------------------|
| 0 | 9 |
-------------------
我正在尝试通过以下查询,但没有得到我想要的结果。
SELECT (SELECT COUNT(*) FROM fm_delivery_management WHERE status=0)
AS Deliverd, (SELECT COUNT(*)
FROM fm_delivery_management
WHERE status=1) AS Pending
FROM fm_delivery_management
通过此查询我得到以下结果
|Deliverd|Pending|
------------------
| 0 | 9 |
| 0 | 9 |
| 0 | 9 |
| 0 | 9 |
| 0 | 9 |
| 0 | 9 |
| 0 | 9 |
| 0 | 9 |
| 0 | 9 |
答案 0 :(得分:1)
在SQL中,数据应该处于规范化结构中,因为它使查询更加简单。您的示例的标准化结果将由......
给出SELECT
status,
COUNT(*)
FROM
fm_delivery_management
GROUP BY
status
此格式表示如果任何新状态开始使用,它会立即包含在结果中,而不会对代码进行任何更改。
如果您将其作为一个函数,它也可以被您将来可能编写的其他代码重用。
它简短,快速,可维护,适应性强,可重用,并且惯用SQL。
人们经常尝试强制SQL创建像你这样的轮回结果。这很容易,我将在下面给出一个例子。但这通常是一个坏主意。透视和格式化通常不属于SQL。它使代码不那么通用,通常更长,更难维护或适应,通常更慢,从软件开发的角度来看,这些都更糟糕。
如果你真的必须这么做,那么你不需要嵌套的子查询。只需使用CASE语句来过滤您正在聚合的内容。
SELECT
SUM(CASE WHEN status = 0 THEN 1 END),
SUM(CASE WHEN status = 1 THEN 1 END)
FROM
fm_delivery_management
答案 1 :(得分:0)
在查询结束时删除“FROM fm_delivery_management”。否则,它将重复该表的所有记录(行)。 只需使用
SELECT (SELECT COUNT(*) FROM fm_delivery_management WHERE status=0)
AS Deliverd, (SELECT COUNT(*) FROM fm_delivery_management WHERE
status=1) AS Pending