0

首先,我为糟糕的措辞道歉,但我不知道如何描述我在做什么......

我有一个计算机类型表(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

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

4

1 回答 1

2

on_hand是 的计数assigned = 0in_use是 的计数assigned = 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
于 2013-05-29T19:36:35.620 回答