2016-07-30 8 views
0

Diese Abfrage:SQL- Tabellen mit auf gemeinsamen Spalten

SELECT CID, count(*) as NumOccurences 
FROM Violations 
WHERE DateOfViolation BETWEEN (dateadd(day, -30, getdate())) AND getdate() 
GROUP BY CID 
ORDER BY count(*) DESC; 

das folgende Ergebnis ergibt:

CID NumOccurences 
    1921 5 
    1042 5 
    1472 5 
    1543 5 
    2084 5 
    2422 5 

NumOccurences korrekt zu sein, überprüft wird. Da CID in anderen Tabellen existiert, Ich möchte CID zu seiner Kreuzung, eine Spalte in der anderen Tabelle Placement[CID,Intersection,...] binden, und zeigen Sie das stattdessen an.

Meine gewünschte Ausgabe ist:

Intersection  NumOccurences 
    Elston and Charles 5 
    Diservey and Pkwy 5 
    Grand and Chicago 5 
    ... 
    ... 

ich das versucht:

SELECT Intersection, count(DateOfViolation) as NumOccurences 
FROM Violations 
inner join Placement on Violations.CID = Placement.CID 
WHERE DateOfViolation BETWEEN (dateadd(day, -30, getdate())) AND getdate() 
GROUP BY Intersection 
ORDER BY count(*) DESC; 

aber erhalten dieses Ergebnis (nicht korrekt):

Intersection   NumOccurences 
    CALIFORNIA AND DIVERSEY 90 
    BELMONT AND KEDZIE  83 
    KOSTNER AND NORTH  82 
    STONEY ISLAND AND 79TH 78 
    RIDGE AND CLARK   60 
    ROOSEVELT AND HALSTED 60 
    ROOSEVELT AND KOSTNER 60 

In der Tat, ich habe Ich habe keine Ahnung, was meine Suchanfrage überhaupt zurückbringt oder woher sie kommt.

EDIT Ausführen der Abfrage

SELECT CID, count(*) as num 
from Placement 
where Intersection = 'BELMONT AND KEDZIE' 
group by Intersection, Address, CID 
order by Intersection, Address, CID 

yeilds

CID  num 
1372 1 
1371 1 
1373 1 

Antwort

1

Ich glaube, Sie so etwas tun könnte:

SELECT 
    MIN(Placement.Intersection) AS Intersection, 
    COUNT(DISTINCT Violation.VID /* Violation ID? */) AS NumOccurences 
FROM Violations INNER JOIN Placement ON Violations.CID = Placement.CID 
WHERE DateOfViolation 
    BETWEEN cast(dateadd(day, -30, getdate()) as date) AND cast(getdate() as date) 
GROUP BY Violations.CID 
ORDER BY NumOccurences DESC; 

Auch mit diesem Datum Bereich vorsichtig sein. Ich bin mir nicht sicher, ob es sich um date oder datetime handelt.

Sie könnten auch versuchen:

SELECT 
    (
    SELECT MIN(Intersection) FROM Placement 
    WHERE Placement.CID = Violations.CID 
    ) AS Intersection, 
    COUNT(*) AS NumOccurences 
FROM Violations 
WHERE DateOfViolation 
    BETWEEN cast(dateadd(day, -30, getdate()) as date) AND cast(getdate() as 
GROUP BY CID 
ORDER BY NumOccurences DESC; 

Sie nicht einmal die MIN() in diesem zweiten benötigen.

1

Es hätte eine Eins-zu-Eins-Beziehung zwischen CIDs und Verschneidungen sein, dass Sie das gewünschte Ergebnis zu erhalten nach.

83 ist eigentlich eine Primzahl, die nahe legt, dass es nicht nur mehrere Einträge für die Schnittmenge BELMONT und KEDZIE in der Platzierungstabelle gibt, sondern dass es mehr als eine CID gibt, die dieser Schnittmenge entspricht. Das gleiche kann wahr sein, dies für andere Kreuzungen

Versuchen:

SELECT Intersection, CID, count(*) as num 
from Placement 
-- where Intersection = 'BELMONT AND KEDZIE' 
group by Intersection, CID 
order by Intersection, CID 

, die Sie zeigen, wie viele von jeder (Kreuzung, CID) Kombination in Ihrer Placement-Tabelle (Kommentar- die where-Klausel auf ‚Belmont aussehen und Kenzie 'speziell). Dann frag dich, was du versuchst zu tun.

+0

Ja, es gibt höchstens 2 CIDs, die diesen Kreuzungen entsprechen. CIDs sind Kamera-IDs, und eine Kreuzung kann höchstens 2 (eine für jede Richtung des Verkehrs) haben. Ich denke ich sehe was das Problem ist. Meine Anfrage wird dann viel komplizierter (für mich zumindest). Zählen Sie die Anzahl der Verstöße von BEIDEN CIDs und listen Sie sie unter dem gleichen Kreuzungsnamen auf.Macht es Ihnen etwas aus, mir zu zeigen, dass Sie ein Denkprozess sind, der Sie zur richtigen Lösung führt? ** EDIT ** Autsch, Belmont und Kezie haben 3 CIDs (schlechte Daten) ... Hinzufügen der Verletzungen von ihnen auch dann? – user3487243

+0

Können Sie mir zeigen, was das Ergebnis der Abfrage, die ich gepostet habe, mit der WHERE-Klausel hinzugefügt wurde? Nur die Spalten CID und Num sind in Ordnung. –

+0

Hinzugefügt zu OP, danke. Diese Daten wurden aus der öffentlichen Datenbank meiner Stadt gezogen. Ave und Avenue sollten auch – user3487243

Verwandte Themen