内部MYSQL条件无法正常工作

时间:2017-10-31 17:05:22

标签: mysql sql

我有两张桌子:这是

sqlfiddle(http://sqlfiddle.com/#!9/5a51734/5

1)[table:data_aoc]

  | aoc_id | aoc_name | aoc_type | client_id |
  |------------------------------|-----------|
1 |  MA01  | sensor_1 |    4     |     1     |
2 |  MA02  | sensor_2 |    15    |     1     |

2)table:data_log

  | log_id | log_aoc_id | trans_type | trans_value | trans_date |
  |-------------------------------------------------------------|
1 |  x1a1  |    MA01    |      0     |     90      | 2017-10-20 |
2 |  afaf  |    MA01    |      0     |     90      | 2017-10-21 |
3 |  va12  |    MA02    |      0     |     10      | 2017-10-21 |
4 |  gag2  |    MA02    |      0     |     10      | 2017-11-25 |

预期结果

Total value for MA02 should be 10 but it shows 20

我的查询如下

SELECT  
(CASE
WHEN a.aoc_type IN ('4')
THEN IFNULL((SUM(b.trans_value * case b.trans_type when '0' then -1 else 1 end)),0)

WHEN a.aoc_type IN ('15') 
THEN IFNULL((SUM(b.trans_value * case when b.trans_type='0' AND DATE(b.trans_date) <= DATE(NOW()) then -1 else 1 end)),0)

END) as total 
FROM data_aoc a
LEFT JOIN data_log b ON b.log_aoc_id = a.aoc_id
WHERE a.client_id='1'
GROUP BY a.aoc_name
ORDER BY a.aoc_id asc

我希望当aoc_type为(15)时,它会将日期条件中的值相加

DATE(b.trans_date) <= DATE(NOW())

但是当我执行查询时,它产生的结果不在日期条件中。 *一些时间戳是在NOW()日期之后提前生成的。

期望的结果应该是:

| Total |
|-------|
| -180  |
|   10  |

但是我得到了

| Total |
|-------|
| -180  |
|   0   |  <----- it should be 10 because of the date condition i put
谢谢你!

2 个答案:

答案 0 :(得分:0)

它似乎完全正常工作。 我得到了日期条款:

Sensor 1 = -180
Sensor 2 = 0

如果你分解了总和,你会得到两行来为传感器#2求和 10月10日至10日(在日期限制之前,所以它乘以-1) 和 10月11日至25日(在日期限制之后,因此它乘以1)

10 * -1 + 10 * 1 = 0

传感器#2读数正确为0。

我不明白为什么你认为它应该是其他任何东西。

答案 1 :(得分:0)

作为Don的相同调查结果的后续行动,并且您的澄清不计算在后,我提出了这个问题...首先预先检查日期,如果之后,再乘以零,否则,应用+/- 1因子。

SELECT
      SUM( b.trans_value * 
           CASE when (    a.aoc_type = '15'
                      AND b.trans_type = '0'
                      AND DATE(b.trans_date) > DATE(NOW())  )
                then 0
                when (    a.aoc_type = '4'
                      AND b.trans_type = '0' )
                  OR (    a.aoc_type = '15'
                      AND b.trans_type = '0'
                      AND DATE(b.trans_date) <= DATE(NOW())  )
                then -1 else 1 end ) as total
   FROM 
      data_aoc a
         LEFT JOIN data_log b 
            ON a.aoc_id = b.log_aoc_id
   WHERE 
      a.client_id='1'
   GROUP BY 
      a.aoc_name
   ORDER BY 
      a.aoc_id asc

Also posted on SQL Fiddle