使用sql查询从表中获取记录计数

时间:2018-01-06 08:58:48

标签: mysql sql

我有一个表交付管理,有交付状态“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   |

2 个答案:

答案 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