2010-12-09 6 views
0

Ich habe eine SQL-Tabelle AddressCount, die 3 Felder hat: address, state und numEntities. Was ich tun möchte, ist die Summe der Zahlen für jede Adresse + Zustand Kombination basierend auf einem Gleichen. Dies ist etwas schwer zu beschreiben, aber ich denke, die folgende korrelierten Abfrage stellt richtig, was ich versuche zu erreichen:Wie kann ich eine Spalte basierend auf wie?

SELECT Address, State, 
    (SELECT SUM(NumEntities) 
    FROM AddressCount innerQry 
    WHERE innerQry.address LIKE '%' + outerQry.address + '%' 
     AND innerQry.state = outerQry.state) As NumEntities 
FROM AddressCount outerQry 

Grundsätzlich mag ich mit einem Tisch, um am Ende, die eine Adresse hat, einen Zustand, und die Summe von numEntities für alle Adressen wie diese Adresse, umgeben von Platzhaltern. Also, wenn die Adresse "25 Courtland Rd" ist und der Staat NJ ist, möchte ich die Summe von numEntities für alle Zeilen erhalten, die einen Status von NJ und eine Adresse wie '% 25 Courtland Rd%' haben. Ich würde es gerne mit einer GROUP BY LIKE machen, aber ich glaube nicht, dass dies mit SQL möglich ist. Das Grundkonzept ist so etwas wie dies zu tun:

SELECT address, state, sum(numEntities) 
FROM AddressCount 
GROUP BY (LIKE '%' + address + '%') 

Die korrelierte Abfrage SQL-Anweisung ich oben genau geschrieben scheint, aber ich möchte die gleiche Sache tun, wenn möglich, durch eine innere des Tisches kommen auf selbst. Vor kurzem las ich, dass es möglich ist, Tabellen auf einem LIKE-Ausdruck zu verbinden, so möchte ich so etwas wie die folgenden erreichen:

SELECT t1.Address, t1.State, SUM(t2.NumEntities) 
FROM AddressCount t1 
INNER JOIN AddressCount t2 
    ON t1.state = t2.state 
    AND t2.address LIKE '%' + t1.address + '%' 

Dies nicht zu funktionieren scheint, aber ... eine Idee, wie ich dies erreichen kann ?

Antwort

3

Wenn ich Sie richtig verstehe, sollte Hinzufügen GROUP BY t1.state, t1.address funktionieren.

+0

Ich möchte nicht nach der genauen Adresse gruppieren, ich möchte nach etwas gruppieren, wie diese Adresse ... – froadie

+0

Ich denke, das passiert hier, zumindest was ich mir vorgestellt habe (und auch @Jacek, anscheinend:)). Könnten Sie Beispiele für Adressen nennen, die Sie in derselben Gruppe sehen würden? –

+0

Ich bin mir ziemlich sicher, dass das hier passiert: Wenn Sie diese drei Reihen haben, alle im Staat NJ und mit den Nummern 1, 2 und 4, erhalten Sie eine Ergebnisreihe: '25 Courtland Road - NJ - 7'. Ich denke, wenn Sie eine linke Verbindung statt der inneren verwenden, erhalten Sie auch: '25 Courtland Road Apt. 34 - NJ - 0' und 'West 25 Courtland Road - NJ - 0'. –

2

Sie müssen nur

GROUP BY t1.Address, t1.State 

... am Ende Ihrer zweiten Abfrage hinzuzufügen. Habe gerade einen kurzen Test mit PostgreSQL gemacht und LIKE und GROUP BY wie erwartet kombiniert, so dass ich keinen Grund sehe, warum es in deinem Fall nicht funktionieren sollte.

+0

Ich will nicht durch die genaue Adresse zu einer Gruppe, möchte ich von so etwas Adresse Gruppe ... – froadie

+0

Aber man durch genaue t2.address nicht Gruppe tun - nur durch genaue t1.address, das ist genau nach deiner Definition schon. – Arvo

0

vielleicht:
SELECT x.state, x.address, SUM (x.NumEntities)
FROM (SELECT * FROM AddressCount WHERE Adresse LIKE%) x
GROUP BY x.state

0

Könnten Sie Probier diese?

SELECT a.Address,t.State,t.numEntities 
FROM 
    dbo.AddressCount a, 
     (SELECT  State,SUM([Count]) as numEntities 
     FROM dbo.AddressCount 
     WHERE Address LIKE '%+address+%' 
     GROUP BY State) t 
WHERE a.State = t.State