2015-04-17 38 views
0

我做了3个表格,问题是我正在计算表格中的板块数量,并将其与特定策略进行比较。如何计算重复的列?

TABLES

|vehicles|    
    |id| |plate|   
    1 VEH001 
    2 VEH002 
    3 VEH003 
    4 VEH004 
    5 VEH001 
    6 VEH002 

|policy_vehicles| 
    |id| |vehicle_id| |policy_id| 
    1   1   1 
    2   2   1 
    3   3   1 
    4   4   2 
    5   6   3 

|policies| 
    |id| |description| 
    1  POL1 
    2  POL2 
    3  POL3 

欲当板名称上重复在这种情况下“VEH001”“数据库”进行计数,重复1次在桌子上的车辆从policy_id = 1

例如policy_id = 1

Policy: POL1 
Has 3 policy_vehicles 
Has 3 plates (VEH001, VEH002, VEH003) 
VEH001 and VEH002 are repeated in the DB = 2 plates repeated 

我试图显示此为r esult

REPEATED 
    2 

又如计数时,不重复关于在这种情况下“VEH004”“数据库”板名不重复对表车辆从policy_id = 2

例如policy_id = 2

Policy: POL2 
Has 1 policy_vehicles 
Has 1 plates (VEH002) 
VEH002 is repeated in the DB = 1 plate repeated 

我想表明这是结果

REPEATED 
    0 

又如计数时板名称上重复在这种情况下“VEH002”“数据库”被重复在桌子上的车辆从policy_id = 3

例如policy_id = 3

Policy: POL3 
Has 1 policy_vehicles 
Has 1 plates (VEH004) 
VEH004 is not repeated 

我“M试图证明这是结果

REPEATED 
    1 

我试图this live demo

Select count(*) FROM (
    SELECT count(*), v.plate 
    FROM vehicles v 
    LEFT JOIN policy_vehicles pv ON v.id = pv.vehicle_id 
    and pv.policy_id = 2 
GROUP by v.plate 
HAVING count(*) > 1) A 

请有人可以帮助我吗?

+0

您的预期结果没有意义。车辆1和车辆4不属于同一政策,车辆5不属于任何车辆。我不知道你怎么能说他们重复? – AdamMc331

回答

1

你说“要重新计算所有盘子从一个特定的政策”,并且“我想在盘子名称在”数据库“上重复时计数,在这种情况下,”VEH001“和”VEH002“重复2次在桌上车上。“

我相信会给你什么后你。这是计数完成后施加的限制。 Where子句在计数完成之前应用。

SELECT count(*), v.plate 
FROM vehicles v 
LEFT JOIN policy_vehicles pv ON v.id = pv.vehicle_id 
and pv.policy_id = 1 
GROUP by v.plate 
HAVING count(*) > 1 ; 

将返回所有板和它们各自的重复计数。 现在听起来像你想的那洙计数......

Select count(*) FROM (
    SELECT count(*), v.plate 
FROM vehicles v 
LEFT JOIN policy_vehicles pv ON v.id = pv.vehicle_id 
and pv.policy_id = 1 
GROUP by v.plate 
HAVING count(*) > 1) A 
+0

XQbert ...我做了你所解释的并没有任何东西http://sqlfiddle.com/#!9/042d6/12请再次阅读我的问题我编辑了我真正想要的内容。 –

+0

这是因为那些盘子不是这个政策。我重读,是的,我错过了那部分。如果你想要一个计数而不考虑该策略......将它作为一个左连接并将where子句移动到连接处,我们可以获得所有的板块...... http://sqlfiddle.com/#!9/042d6/16/1内部连接正在消除(某些)您想要计数的板块,而政策工具的where子句正在消除其余部分。因此,我们创建一个外部联接并将where子句移动到联接本身,以防止它消除由联接创建的空值。小提琴非常帮助:P – xQbert

+0

xQbert ...我正在测试您的查询,但在使用policy_id = 2时不起作用... http://sqlfiddle.com/#!9/0e71b/2并且应该得到0 –

0

我会通过让所有有问题的行,预成型任何聚集之前启动。你可以用内这么做加入这样的:

SELECT p.description, pv.vehicle_id, v.plate 
FROM policies p 
JOIN policy_vehicles pv ON pv.policy_id = p.id 
JOIN vehicles v ON v.id = pv.vehicle_id 
WHERE p.id = 1; 

要查看每个车牌被重复了多少遍,我写了一个子查询得到一个计数每块板是这样的:

SELECT v.plate, COUNT(*) AS repeated 
FROM vehicles v 
GROUP BY v.plate; 

然后,我将两者加在一起看到每个重复值:

SELECT t1.description, t1.vehicle_id, t1.plate, t2.repeated 
FROM(
    SELECT p.description, pv.vehicle_id, v.plate 
    FROM policies p 
    JOIN policy_vehicles pv ON pv.policy_id = p.id 
    JOIN vehicles v ON v.id = pv.vehicle_id 
    WHERE p.id = 1) t1 
JOIN(
    SELECT v.plate, COUNT(*) AS repeated 
    FROM vehicles v 
    GROUP BY v.plate) t2 ON t2.plate = t1.plate; 

这里是一个SQL Fiddle的例子。