【问题标题】:mysql if value = "0" then get other value [closed]mysql如果值=“0”然后获取其他值[关闭]
【发布时间】:2020-06-02 03:12:06
【问题描述】:

我有一张如下表:

+-----------+------+--------+
| stockcode | year | equity |
+-----------+------+--------+
| AALI      | 2016 |  17347 |
| AALI      | 2017 |  18236 |
| AALI      | 2018 |  18990 |
| AALI      | 2019 |  18521 |
| ABBA      | 2016 |    132 |
| ABBA      | 2017 |    104 |
| ABBA      | 2018 |    203 |
| ABBA      | 2019 |      0 |
| ABDA      | 2016 |   1232 |
| ABDA      | 2017 |   1375 |
| ABDA      | 2018 |   1334 |
| ABDA      | 2019 |   1254 |
+-----------+------+--------+

我需要一个查询来获取基于去年的股权值。 如果2019年股权的价值=0,则得到2018年的价值。

我尝试过这样,但没有成功(空白页):

SELECT IF(equity <> '0', equity, SELECT equity FROM table_equity WHERE year='2018' AND stockcode='".$stockcode."') as equity FROM table_equity WHERE year='2019' AND stockcode='".$stockcode."'"

但是当我尝试使用这样的代码时,它可以工作:

SELECT IF(equity <> '0', "active", "nonactive") as equity FROM table_equity WHERE year='2019' AND stockcode='".$stockcode."'"

但结果当然不是我想要的

那么怎么做呢?

【问题讨论】:

  • 也许只是在equity 不是0 的位置按year 排序并选择最新的?
  • 如果一个值为零但没有上一年的值怎么办?如果上一年的值也为零怎么办?
  • @Akina 2018 的价值从不为零
  • 为显示的源数据显示所需的输出。

标签: mysql sql-order-by where-clause


【解决方案1】:

当您按股票代码过滤时,我会按年份(desc)排序,然后获得非零权益的第一行:

"SELECT * FROM table_equity 
WHERE stockcode='".$stockcode."' AND equity <> 0 AND year < YEAR(CURDATE())
ORDER BY year DESC
LIMIT 1"

你应该使用prepared statements来防止sql注入攻击。

【讨论】:

  • 太棒了,它的工作100%,非常感谢您,先生
【解决方案2】:

我假设您的年份和净值列都是整数:

SELECT stockcode,year, equity FROM your_table 
WHERE year = 1919 and equity > 0 or year = 1918;

这应该回答你的问题

【讨论】:

  • 对不起,这并不能解决我的问题,但感谢您的帮助
  • 为什么是 1919/1918?还要考虑andor
【解决方案3】:

使用 2 份表格副本 - 一份提供当年数据,另一份提供上一年数据。使用 CASE 运算符并将零/空替换为上一年的值(如果表中不存在上一年的数据,则为零)。

SELECT t1.stockcode,
       t1.year,
       CASE WHEN t1.equity > 0 
            -- get current value if it is positive
            THEN t1.equity
            -- get previous value if current is zero,
            -- and get zero if no data for previous year
            ELSE COALESCE(t2.equity, 0) END equity,
       -- show previous year value, or zero if it is not present
       COALESCE(t2.equity, 0) previous_year_equity
FROM source_table t1
LEFT JOIN source_table t2 ON t1.year = t2.year + 1
                         AND t1.stockcode = t2.stockcode

fiddle

【讨论】:

  • 对不起,这并不能解决我的问题,但感谢您的帮助
  • @IbnulHusainan 我添加了一个小提琴 - 看看它,零值被替换为上一年记录中的值。怎么了?
  • 我一共有134条数据,上面的查询告诉我500多条数据的结果
  • @IbnulHusainan 这意味着您的表包含(股票代码,年份)的重复项。您没有提到这一点,也没有告诉在这种情况下要做什么(如果一个记录包含零而另一个不包含,如果两者都不为零但不相等,等等......)。您的示例数据也不包含此类重复项。
猜你喜欢
  • 2020-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多