2016-10-14 14 views
6

Utknąłem w tym pytaniu. Czy ktoś może pomóc?Zapytanie SQL z wieloma warunkami

Napisz zapytanie do wydrukowania sumę wszystkich łącznej wartości inwestycji w 2015 (TIV_2012) skali Toa 2 miejsc po przecinku, dla wszystkich ubezpieczających, którzy spełniają następujące kryteria:

1) mają taką samą wartość TIV_2011 jako jeden lub więcej innych ubezpieczających.

2) nie znajdują się w tym samym mieście co innego ubezpieczającego (tzn (szerokość, długość) przypisują para musi być unikalny,

format wejściowy islike to, Stół jest

stół Ubezpieczenie jest opisane w następujący sposób:

Nazwa kolumny Typ PID INTEGER TIV_2011 NUMERIC TIV_2012 NUMERIC LAT NUMERIC LON NUMERIC

gdzie PID to identyfikator polisy ubezpieczającego, TIV_2011 to całkowita inwestycja w 2011 roku, TIV_2012 to całkowita inwestycja w 2012 roku, LAT to szerokość geograficzna miasta posiadacza polisy, a LON to długość geograficzna miasta posiadacza polisy.

Na przykład, jeśli dane THHE jest PID TIV_2011, TIV_2012, szer

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

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

  3. 3, 400, 400, 60, 90

  4. 4, 500, 600, 80, 80

  5. 5, 400, 300.1, 6, 6

Odpowiedź byłaby 1601,30. Suma (300,1, 400, 500,7, 400,5)

Tak daleko I mają pochodzić z tego

SELECT SUM (TIV_2012) z ubezpieczenia GDZIE NIE UNIQUE (Wybierz TIV_2011 z ubezpieczenia);

To nie działa, pojawia się błąd. Ktoś pls pomóc.

+1

To pytanie jest nieco niejasne. Czy możesz podać przykładowe dane i oczekiwane wyniki? –

+0

Dodałem przykład powyżej – sqlnoob

Odpowiedz

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

Dziękuję bardzo 1 – sqlnoob

+2

Pytanie brzmi: "Nie znajdują się w tym samym mieście, co inny posiadacz polisy" - zastanawiam się, dlaczego następnie zapytanie SQL ma wartość "ON t1.lat = t3.lat AND t1.lon = t3.lon'? – jeffreyveon

+0

@jeffreyveon Druga kwerenda sprzężenia wewnętrznego podaje nam wynik przy użyciu warunku (* nie znajduje się w tym samym mieście co inny posiadacz polisy *), o którym wspomniano, ale 'ON t1.lat = t3.lat AND t1.lon = t3. lon' służy do określenia kolumn dla łączenia z resztą danych. – CrakC

0

wierzę zapytanie trzeba napisać posiada dwie wewnętrzne łączy i idzie tak:

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 
Powiązane problemy