如何使用另一个表中的所有记录作为计数列?

时间:2016-01-21 10:37:46

标签: sql join view count

我有4张桌子:

位置:

location_id   name
------------------------
1             France

设备:

device_id     location_id    model_id
-------------------------------------
1             1              1
2             1              2
3             1              3

模型:

model_id      family_id      name
-------------------------------------
1             1              C-max
2             1              S-max
3             2              Vectra

和家人:

family_id    name
---------------------
1            Ford
2            Opel

我现在需要构建一个复杂的SQL查询。结果,我想收到这个:

location_id    name      Ford      Opel
------------------------------------------
1              France    2         1

是否可以在SQL中完成?我看到那里有问题:

  • 关于将其他表记录用作查询

  • 中的列
  • 关于嵌套表格

  • 关于计算元素(count函数?)

任何评论/参考资料对我都有帮助。我不等待最终的代码。

2 个答案:

答案 0 :(得分:1)

在SQL查询中,列已修复。根据数据而不是列,您可以获得更多或更少的。但这没关系,因为SQL即将获取数据而不显示它。后者是GUI层的任务。

因此,获得所需的数据,主要是每个地点和家庭的模型数量。

select l.location_id, l.name as location_name, f.name as family_name, count(*) as models
from location l
join device d on d.location_id = l.location_id
join model m on m.model_id = d.model_id
join family f on f.family_id = m.family_id
group by l.location_id, l.name, f.name
order by l.location_id, l.name, f.name;

这就是您从数据库中获得的所有内容。如何显示数据是您的程序的任务,在您的情况下是一个Delphi应用程序。因此,使用Delphi通过上述查询读取数据,并在一个简单的循环中填充网格。

答案 1 :(得分:0)

谢谢大家提供的有用提示。

我使用静态方法和@Matt发布的代码解决了我的问题。因为其他人可能正在寻找解决方案,我在这里粘贴我对PostgreSQL的工作查询:

SELECT DISTINCT t.location_id, t.name, SUM(t.ford) AS ford, SUM(t.opel) as opel
FROM(
SELECT l.location_id, l.name, 
(SELECT COUNT(m.family_id) WHERE m.family_id = '1') AS ford, 
(SELECT COUNT(m.family_id) WHERE m.family_id = '2') AS opel 
FROM location l
INNER JOIN device d ON l.location_id = d.location_id
INNER JOIN model m ON d.model_id = m.model_id
INNER JOIN family f ON m.family_id = f.family_id
GROUP BY l.location_id, l.name, m.family_id
) t
GROUP BY t.location_id;