【问题标题】:SQL query with multiple conditions具有多个条件的 SQL 查询
【发布时间】:2017-02-24 10:00:39
【问题描述】:

我被这个问题困住了。任何人都可以帮忙吗?

为满足以下条件的所有投保人编写查询以打印 2015 年 (TIV_2012) 中所有总投资值的总和,精确到小数点后 2 位:

1) 与一位或多位其他投保人具有相同的 TIV_2011 价值。

2) 与其他投保人不在同一城市(即(纬度,经度)属性对必须是唯一的,

输入格式是这样的,表格是

保险表说明如下:

列名类型 PID 整数 TIV_2011 数字 TIV_2012 数字 纬度数字 LON 数字

其中PID是投保人的保单ID,TIV_2011是2011年的总投资,TIV_2012是2012年的总投资,LAT是投保人所在城市的纬度,LON是投保人所在城市的经度。

例如,如果数据是 PID、TIV_2011、TIV_2012、纬度、经度

  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

答案是 1601.30。 (300.1, 400, 500.7, 400.5)的总和

所以,到目前为止,我想出了这个

从不唯一的保险中选择 SUM(TIV_2012)(从保险中选择 TIV_2011);

这不起作用,我收到错误消息。有人请帮忙。

【问题讨论】:

  • 这个问题有点不清楚。您能否提供一些示例数据和预期输出?
  • 我在上面加了一个例子

标签: mysql sql


【解决方案1】:
SELECT CAST(SUM(t1.TIV_2012) as DECIMAL(10,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

【讨论】:

  • 非常感谢 1
  • 问题是Are not located in the same city as another policy holder - 我想知道为什么SQL查询有ON t1.lat = t3.lat AND t1.lon = t3.lon
  • @jeffreyveon 第二个内部连接查询使用您提到的条件(与另一个保单持有人不在同一个城市)为我们提供了结果,但ON t1.lat = t3.lat AND t1.lon = t3.lon 是用于指定与其余数据连接的列。
  • 此查询中缺少小数点后 2 位
【解决方案2】:

中选择 sum(d.tiv_2012) 作为 Total_2012_TIV

(选择 a.TIV_2011,a.TIV_2012,a.lat,a.lon 从保险a 加入 (选择 TIV_2011,计数()计数 来自保险 按 T​​IV_2011 分组 有计数()> 1 )b 在 a.TIV_2011 = b.TIV_2011 加入 (选择纬度,计数(纬度) lat_count 从保险 按纬度分组 计数(纬度)=1 )C 在 a.lat = c.lat)d

【讨论】:

    【解决方案3】:
    SELECT SUM(i1.TIV_2012) FROM (
      SELECT * ,COUNT(1) OVER (PARTITION BY i.TIV_2011 ORDER BY i.TIV_2011) R2 ,COUNT(1) OVER (PARTITION BY i.Lat, i.Lon ORDER BY i.Lat, i.Lon) R1 FROM 
        #Insurance i) i1 
    WHERE R2 > 1 AND R1 = 1  
    

    【讨论】:

    • 我以前的回答不正确:SELECT SUM(i1.TIV_2012) FROM (SELECT * ,COUNT(1) OVER (PARTITION BY i.TIV_2011 ORDER BY i.TIV_2011) R2 ,COUNT(1) OVER (PARTITION BY i.Lat, i.Lon ORDER BY i.Lat, i.Lon) R1 FROM #Insurance i) i1 WHERE R2 > 1 AND R1 = 1
    【解决方案4】:

    这里的所有答案都在一种方法中。我尝试了其他方法,所以提交它。

    SELECT CAST(SUM(i.TIV_2012) AS NUMERIC(18,2))
    FROM Insurance i
    WHERE i.PID IN (SELECT DISTINCT(i1.PID)
                    FROM Insurance i1
                    INNER JOIN Insurance i2 ON (i1.TIV_2011 = i2.TIV_2011 AND i1.PID <> i2.PID)
                    WHERE NOT EXISTS (SELECT i3.PID 
                        FROM Insurance i3 
                        WHERE i1.PID <> i3.PID
                        AND i1.LAT = i3.LAT
                        AND i1.LON = i3.LON));
    

    【讨论】:

      【解决方案5】:
      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
      

      【讨论】:

        【解决方案6】:
        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
        

        【讨论】:

          【解决方案7】:

          我相信您需要编写的查询有两个内连接,如下所示:

          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 >>
          

          【讨论】:

            猜你喜欢
            • 2021-07-26
            • 1970-01-01
            • 2019-07-18
            • 2013-12-05
            • 1970-01-01
            • 1970-01-01
            • 2016-05-28
            • 2021-07-07
            • 2020-02-12
            相关资源
            最近更新 更多