2016-10-14 22 views
6

Tôi bị kẹt trong câu hỏi này. Có ai giúp được không?Truy vấn SQL với nhiều điều kiện

Viết một truy vấn để in tổng của tất cả tổng giá trị đầu tư vào năm 2015 (TIV_2012) quy mô toa của 2 chữ số thập phân, cho tất cả các hợp đồng bảo hiểm đáp ứng các tiêu chí sau:

1) Có giá trị TIV_2011 giống như một hoặc nhiều chủ hợp đồng khác.

2) Không phải nằm trong cùng một thành phố như một người giữ chính sách (tức là (vĩ độ, kinh độ) thuộc tính cặp phải là duy nhất,

định dạng đầu vào islike này, bàn là

bảng Bảo hiểm là mô tả như sau:

Tên cột Kiểu PID INTEGER TIV_2011 NUMERIC TIV_2012 NUMERIC LẠT NUMERIC LON NUMERIC

trong đó PID là ID chính sách của chủ hợp đồng, TIV_2011 là tổng mức đầu tư vào năm 2011, TIV_2012 là tổng mức đầu tư vào năm 2012, LAT là vĩ độ của thành phố chủ sở hữu chính sách và LON là kinh độ của thành phố chủ hợp đồng.

Ví dụ, nếu dữ liệu thhe là PID, TIV_2011, TIV_2012, lat, lon

  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. 012.
  6. 5, 400, 300,1, 6, 6

Câu trả lời sẽ là 1601,30. Tổng của (300,1, 400, 500,7, 400,5)

Vì vậy, đến nay tôi đã đưa ra với điều này SUM

SELECT (TIV_2012) TỪ Bảo hiểm ĐÂU KHÔNG UNIQUE (SELECT TIV_2011 từ bảo hiểm);

Điều này không có tác dụng, tôi gặp lỗi. Ai đó xin giúp đỡ.

+1

Câu hỏi này là một chút không rõ ràng. Bạn có thể bao gồm một số dữ liệu mẫu và đầu ra dự kiến ​​không? –

+0

Tôi đã thêm một ví dụ ở trên – sqlnoob

Trả lời

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

Cảm ơn bạn rất nhiều 1 – sqlnoob

+2

Câu hỏi nói 'Không nằm trong cùng thành phố với chủ sở hữu chính sách khác' - tôi tự hỏi tại sao truy vấn SQL lại có 'ON t1.lat = t3.lat AND t1.lon = t3.lon'? – jeffreyveon

+0

@jeffreyveon Truy vấn kết nối bên trong thứ hai cho chúng ta kết quả bằng cách sử dụng điều kiện (* Không nằm trong cùng thành phố với một người giữ chính sách khác) mà bạn đã đề cập nhưng 'ON t1.lat = t3.lat AND t1.lon = t3. lon' được sử dụng để chỉ định các cột cho phép nối với phần còn lại của dữ liệu. – CrakC

0

tôi tin rằng các truy vấn mà bạn cần phải viết có hai bên tham gia và đi như thế này:

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 
Các vấn đề liên quan