我有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
函数?)
任何评论/参考资料对我都有帮助。我不等待最终的代码。
答案 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;