使用MySQL将行总计作为另一个表中的列进行调整

时间:2013-05-29 19:32:32

标签: mysql

首先,我为可怕的措辞道歉,但我不确定如何描述我正在做的事情......

我有一个计算机类型表(id,type,name),名为com_types

id    |    type    | name    
 1    |     1      | Dell
 2    |     4      | HP

在第二个表格中,我有每台计算机,其中包含一列' type_id'表示它是什么类型的计算机,称为com_assets

id    |    type_id    |  is_assigned
 1    |       4       |  0
 2    |       1       |  1

我想创建一个显示每种计算机类型的视图,以及我们手头和使用的数量以及总数,因此结果将是

id    |    type    |    name    |    on_hand    |     in_use     |    total    |
 1    |      1     |    Dell    |       0       |       1        |      1      |
 2    |      4     |     HP     |       1       |       0        |      1      |

如您所见,on_hand,in_use和total列依赖于第二个表中的type_id和is_assigned列。

到目前为止,我已经尝试过这个......

CREATE VIEW test AS

SELECT id, type, name,

( SELECT COUNT(*) FROM com_assets WHERE type_id = id AND is_assigned = '0' ) as on_hand,

( SELECT COUNT(*) FROM com_assets WHERE type_id = id AND is_assigned = '1' ) as in_use,

SUM( on_hand + in_use ) AS total

FROM com_types

但是所有这些返回的是一列具有所有正确值,除了总数等于另一个表中的所有计算机。我需要一个触发器吗?

1 个答案:

答案 0 :(得分:2)

on_handassigned = 0的计数,in_useassigned = 1的计数。您可以将它们统计在一起,而不需要相关的子查询,如下所示:

SELECT
  com_types.id,
  com_types.type,
  com_types.name,
  COUNT(CASE WHEN com_assets.is_assigned = 0 THEN 1 END) AS on_hand,
  COUNT(CASE WHEN com_assets.is_assigned = 1 THEN 1 END) AS in_use,
  COUNT(*) AS total
FROM com_types
JOIN com_assets ON com_types.id = com_assets.id
GROUP BY
  com_types.id,
  com_types.type,
  com_types.name