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

0h4hbjxa  于 2021-06-21  发布在  Mysql
关注(0)|答案(2)|浏览(334)

我有一个表传递管理,有传递状态“已传递”和“待定”。我要每个人的总记录数。我需要以下格式的答案

|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   |
km0tfn4u

km0tfn4u1#

删除查询末尾的“from fm\u delivery\u management”。否则,它将对该表的所有记录(行)重复。只是使用

SELECT (SELECT COUNT(*) FROM fm_delivery_management WHERE status=0)
AS Deliverd, (SELECT COUNT(*) FROM fm_delivery_management WHERE 
status=1) AS Pending
093gszye

093gszye2#

在sql中,数据应该是标准化的结构,因为它使查询更加简单。你的例子的标准化结果将由。。。

SELECT
  status, 
  COUNT(*) 
FROM
  fm_delivery_management
GROUP BY
  status

这种格式意味着,如果开始使用任何新的状态,它会立即包含在结果中,而不会对代码进行任何更改。
如果你把它作为一个函数,它也会被你将来可能编写的其他代码重用。
它是简短、快速、可维护、适应性强、可重用和惯用的sql。
人们经常试图强迫sql创建像您这样的数据透视结果。这很容易做到,我将在下面举一个例子。但这通常是个坏主意。数据透视和格式化通常不属于sql。从软件开发的Angular 来看,它使代码不那么通用,通常更长,更难维护或调整,通常更慢,而且总体上更糟。
如果您真的必须用不好的方法来做,那么您不需要嵌套的子查询。只需使用case语句过滤您正在聚合的内容。

SELECT
  SUM(CASE WHEN status = 0 THEN 1 END), 
  SUM(CASE WHEN status = 1 THEN 1 END)
FROM
  fm_delivery_management

相关问题