2016-10-14 5 views
6

Ich bin auf dieser Frage fest. Kann jemand helfen?SQL-Abfrage mit mehreren Bedingungen

eine Abfrage, die Summe aller Gesamtinvestitionswerte im Jahr 2015 (TIV_2012) Toa Skala von 2 Dezimalstellen für alle Versicherungsnehmer zu drucken, die die folgenden Kriterien erfüllen:

1) den gleichen TIV_2011 Wert als eine oder mehr andere Versicherungsnehmer.

2) sind nicht in der gleichen Stadt wie ein anderer Versicherungsnehmers (dh (Breite, Länge) befindet Paar Attribut muss eindeutig sein,

das Eingabeformat islike dies: Der Tisch ist

Insurance Tabelle ist wie folgt beschrieben:

Spaltenname Typ PID INTEGER TIV_2011 NUMERIC TIV_2012 NUMERIC LAT NUMERIC LON NUMERIC

Dabei ist PID die Policy-ID des Versicherungsnehmers, TIV_2011 die Gesamtinvestition im Jahr 2011, TIV_2012 die Gesamtinvestition im Jahr 2012, LAT der Breitengrad der Stadt des Versicherungsnehmers und LON der Längengrad der Stadt des Versicherungsnehmers.

Zum Beispiel, wenn thhe Daten PID, TIV_2011, TIV_2012, 80 Lat, Lon

  1. 1, 300, 400,5, 60, 70

  2. 2, 300, 500,7, 70,

  3. 3, 400, 400, 60, 90

  4. 4, 500, 600, 80, 80

  5. 012.
  6. 5, 400, 300.1, 6, 6

Die Antwort wäre 1.601,30 sein. Summe (300,1, 400, 500,7, 400,5)

So weit ich habe mit diesem

SELECT SUM (TIV_2012) aus dem Versicherungs WHERE NOT UNIQUE (SELECT TIV_2011 von Versicherungen) kommen;

Dies funktioniert nicht, ich bekomme einen Fehler. Jemand hilft.

+1

Diese Frage etwas unklar ist. Könnten Sie einige Beispieldaten und die erwartete Ausgabe hinzufügen? –

+0

Ich habe ein Beispiel oben hinzugefügt – sqlnoob

Antwort

9
SELECT SUM(t1.TIV_2012) 
FROM Insurance t1 
INNER JOIN 
(
    SELECT TIV_2011 
    FROM Insurance 
    GROUP BY TIV_2011 
    HAVING COUNT(*) > 1 
) t2 
    ON t1.TIV_2011 = t2.TIV_2011 
INNER JOIN 
(
    SELECT lat, lon 
    FROM Insurance 
    GROUP BY lat, lon 
    HAVING COUNT(*) = 1 
) t3 
    ON t1.lat = t3.lat AND 
     t1.lon = t3.lon 
+0

Vielen Dank 1 – sqlnoob

+2

Die Frage sagt 'Sind nicht in der gleichen Stadt wie ein anderer Versicherungsnehmer '- Ich frage mich, warum hat dann die SQL-Abfrage' ON t1.lat = t3.lat UND t1.lon = t3.lon'? – jeffreyveon

+0

@jeffreyveon Die zweite innere Join-Abfrage gibt uns das Ergebnis unter Verwendung der Bedingung (* Befindet sich nicht in der gleichen Stadt wie ein anderer Versicherungsnehmer *), die Sie erwähnt haben, aber 'ON t1.lat = t3.lat AND t1.lon = t3. lon' wird verwendet, um Spalten für den Join mit den restlichen Daten anzugeben. – CrakC

0

Ich glaube, die Abfrage, die Sie schreiben müssen zwei Innen verbindet und geht so:

SELECT SUM(ins1.column_of_interest) as value_needed 
FROM Insurance ins1 
INNER JOIN Insurance ins2 ON (ins1.id = ins2.id AND <<conditions to get same TIV_2011 applied to ins2 >>) 
INNER JOIN Insurance ins3 ON (ins1.id = ins3.id AND << conditions to get unique latitude, longitude on ins3 >>) 
WHERE << other conditions you may apply to ins1 >> 
0
Round(x,2) -> to scale to 2 decimal digits 
inner join 1 -> for condition 1 (finds all the repeating TIV_2011) 
inner join 2 -> for condition 2 (finds LAT, LON that are distinct as a pair) 

Select ROUND(SUM(i1.TIV_2012),2) 
from Insurance i1 
inner join 
    (Select TIV_2011 
    from Insurance 
    group by TIV_2011 
    having count(*) > 1) i2 
on 
    i1.TIV_2011 = i2.TIV_2011 
inner join 
    (Select LAT, LON 
    from Insurance 
    group by LAT, LON 
    having count(*) = 1) i3 
on 
    i1.LAT = i3.LAT 
and 
    i1.LON = i3.LON 
0
SELECT CAST(SUM(t1.TIV_2012) as DECIMAL(11,2)) 
FROM Insurance t1 
INNER JOIN (
    SELECT TIV_2011 
    FROM Insurance 
    GROUP BY TIV_2011 HAVING COUNT(*) > 1) t2 ON t1.TIV_2011 = t2.TIV_2011 
INNER JOIN ( 
    SELECT lat, lon 
    FROM Insurance 
    GROUP BY lat, lon HAVING COUNT(*) = 1) t3 ON t1.lat = t3.lat AND t1.lon = t3.lon