我有两张桌子:这是
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
谢谢你!
答案 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