首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MYSQL内部情况不起作用

MYSQL内部情况不起作用
EN

Stack Overflow用户
提问于 2017-10-31 17:05:22
回答 2查看 97关注 0票数 0

我有两张桌子:这是

方形小提琴(http://sqlfiddle.com/#!9/5a51734/5)

1) table:data_aoc

代码语言:javascript
复制
  | aoc_id | aoc_name | aoc_type | client_id |
  |------------------------------|-----------|
1 |  MA01  | sensor_1 |    4     |     1     |
2 |  MA02  | sensor_2 |    15    |     1     |

2) table:data_log

代码语言:javascript
复制
  | 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 |

预期结果

代码语言:javascript
复制
Total value for MA02 should be 10 but it shows 20

我的问题如下

代码语言:javascript
复制
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)时,它将在日期条件内求和该值。

代码语言:javascript
复制
DATE(b.trans_date) <= DATE(NOW())

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

预期的结果应该是:

代码语言:javascript
复制
| Total |
|-------|
| -180  |
|   10  |

但我得到

代码语言:javascript
复制
| Total |
|-------|
| -180  |
|   0   |  <----- it should be 10 because of the date condition i put

谢谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-11-01 01:04:57

作为对唐同样发现的跟进,以及你对“不算数”的澄清,我想出了一个问题.先对日期进行预检查,然后再乘以零,否则,应用+/- 1因子。

代码语言:javascript
复制
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

也在上发布

票数 0
EN

Stack Overflow用户

发布于 2017-11-01 00:32:06

它似乎运作得恰如其分。关于日期条款,我得到:

代码语言:javascript
复制
Sensor 1 = -180
Sensor 2 = 0

如果分解求和,将得到两行数据,分别用于传感器2、10和11-25 (在日期限制之前,所以它乘以-1)和10行(在日期限制之后,它被乘以1)。

代码语言:javascript
复制
10 * -1 + 10 * 1 = 0

传感器#2读数正确。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47040823

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档