2015-04-17 40 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的例子。