如何使用条件创建查询?

时间:2013-11-06 17:37:13

标签: mysql sql mysqli

大家好,我正在尝试在数组中添加条件。

我想要

   if policy.date_ini >= insurance.initial_date do
      sum of all net_ensurance where date_ini >= initial_date
   end

   |policies|
     |id|   |date_ini|  |num_policy|
      1      2013-02-30      1234

   |insurances|
     |id|  |policy_id|   |initial_date|   |net_ensurance|
      1       1            2013-03-30         1000
      2       1            2013-02-30         2000 
      3       1            2012-12-05         5000

我应该

      |num_policy|  |sum_net_ensurance|
        1234                 3000

注意:   我在数据库中的关系如下:

 class Policy < ActiveRecord::Base
    has_many :insurances
 end

 class Insurance < ActiveRecord::Base
    belongs_to :policy
 end

请有人可以帮助我吗?

我真的很感激帮助

3 个答案:

答案 0 :(得分:2)

我觉得你有点困惑。您要求的是net_esureance的总和,其中保单日期是&gt; =初始日期。

首先,2013-02-30不是有效日期。 2月只有28天。

编辑:您是否将其存储为varchar列?这是一个非常糟糕的主意。

所以,我用2013-02-28替换了它。

接下来,你真的是指政策日期> =初始日期?如果是这样,那么每一行都是如此,所以你会回来7000.

SELECT num_policy,
sum(CASE WHEN p.date_ini >= i.initial_date
THEN ( net_ensurance) ELSE 0 END) FROM policies p
INNER JOIN insurances i ON p.id = i.policy_id

结果:

NUM_POLICY  SUM_NET_ESURANCE
1234        7000

enter code here

如果你的意思相反,你会得到你期望的3000:

SELECT num_policy,
sum(CASE WHEN  i.initial_date >= p.date_ini
THEN ( net_ensurance) ELSE 0 END) FROM policies p
INNER JOIN insurances i ON p.id = i.policy_id

结果:

NUM_POLICY  SUM_NET_ESURANCE
1234        3000

SQLFiddle

答案 1 :(得分:0)

SELECT num_policy,CASE WHEN policy.date_ini >= insurance.initial_date
THEN SUM( net_ensurance) ELSE 0 END FROM policies p
INNER JOIN insurances i ON p.id = i.policy_id

答案 2 :(得分:0)

SELECT 
    p.id AS num_policy,
    SUM(i.net_ensurance) AS net_ensurance
FROM policies p
INNER JOIN insurances i ON p.id = i.policy_id AND p.date_ini >= i.initial_date
GROUP BY p.id