mysql - 让 SQL 选择最后一个非零金额

标签 mysql sql

我目前有一个目前采用这种格式的表格

id | year | jan | feb | mar | apr | may | jun | jul | aug | sep | oct | nov | dec
A    2001  0.00   1.00  0.00  0.00  1.00  1.00  0.00  0.00  0.00  0.00  0.00  0.00
A    2003  0.00   1.00  0.00  0.00  1.00  1.00  0.00  0.00  0.00  0.00  0.00  0.00
A    2005  0.00   0.00  0.00  0.00  0.00  0.00  0.00  0.00  3.00  0.00  0.00  0.00

我想得到的结果是这样的

id | firstyear | lastyear | lastpaidamount
A      2001       2005           3.00

我尝试使用此代码,但我得到的 lastpaidamount 为 NULL

    SELECT 
  a.id,
  MIN(YEAR) AS firstyear,
  MAX(YEAR) AS lastyear,
  b.lastpaidadmount 
FROM
  table1 a 
  LEFT JOIN 
    (SELECT 
      id,
      CASE
        WHEN dec > 0 
        THEN dec 
        WHEN nov > 0 
        THEN nov 
        WHEN oct > 0 
        THEN oct 
        WHEN sep > 0 
        THEN sep 
        WHEN aug > 0 
        THEN aug 
        WHEN jul > 0 
        THEN jul 
        WHEN jun > 0 
        THEN jun 
        WHEN may > 0 
        THEN may 
        WHEN apr > 0 
        THEN apr 
        WHEN mar > 0 
        THEN mar 
        WHEN feb > 0 
        THEN feb 
        WHEN jan > 0 
        THEN jan 
      END AS lastpaidamount 
    FROM
      table1 
    WHERE YEAR = 'a.lastyear' 
    GROUP BY id) b 
    ON a.id = b.id 
WHERE jan > 0 
  OR feb > 0 
  OR mar > 0 
  OR apr > 0 
  OR may > 0 
  OR jun > 0 
  OR jul > 0 
  OR aug > 0 
  OR aug > 0 
  OR sep > 0 
  OR oct > 0 
  OR nov > 0 
  OR dec > 0 
GROUP BY id ;

在此感谢任何帮助,谢谢!

最佳答案

我很想使用 View 将您当前的表拆分为更符合逻辑的内容:-

CREATE VIEW `vw_extract` AS 
SELECT id, `year` AS aYear, 12 AS aMonth, `dec` AS aAmount FROM table1 UNION
SELECT id, `year` AS aYear, 11 AS aMonth, nov AS aAmount FROM table1 UNION
SELECT id, `year` AS aYear, 10 AS aMonth, oct AS aAmount FROM table1 UNION
SELECT id, `year` AS aYear, 9 AS aMonth, sep AS aAmount FROM table1 UNION
SELECT id, `year` AS aYear, 8 AS aMonth, aug AS aAmount FROM table1 UNION
SELECT id, `year` AS aYear, 7 AS aMonth, jul AS aAmount FROM table1 UNION
SELECT id, `year` AS aYear, 6 AS aMonth, jun AS aAmount FROM table1 UNION
SELECT id, `year` AS aYear, 5 AS aMonth, may AS aAmount FROM table1 UNION
SELECT id, `year` AS aYear, 4 AS aMonth, apr AS aAmount FROM table1 UNION
SELECT id, `year` AS aYear, 3 AS aMonth, mar AS aAmount FROM table1 UNION
SELECT id, `year` AS aYear, 2 AS aMonth, feb AS aAmount FROM table1 UNION
SELECT id, `year` AS aYear, 1 AS aMonth, jan AS aAmount FROM table1 ;

然后你的结果可以使用这个(非常符合标准的相当冗长的)查询得到:-

SELECT Sub1.id, Sub1.firstyear, Sub1.lastyear, Sub3.aAmount
FROM
(
    SELECT id, MIN(aYear) AS firstyear, MAX(aYear) AS lastyear
    FROM vw_extract
    WHERE aAmount > 0
    GROUP BY id
) Sub1
INNER JOIN
(
    SELECT id, aYear, MAX(aMonth) AS lastmonthofyear
    FROM vw_extract
    WHERE aAmount > 0
    GROUP BY id, aYear
) Sub2
ON Sub1.id = Sub2.id
AND Sub1.lastyear = Sub2.aYear
INNER JOIN
(
    SELECT id, aYear, aMonth, aAmount
    FROM vw_extract
    WHERE aAmount > 0
) Sub3
ON Sub2.id = Sub3.id
AND Sub2.aYear = Sub3.aYear
AND Sub2.lastmonthofyear = Sub3.aMonth

或者对 MySQL GROUP_CONCAT 函数做一些小改动

SELECT id, MIN(aYear) AS firstyear, MAX(aYear) AS lastyear, SUBSTRING_INDEX(GROUP_CONCAT(aAmount ORDER BY aYear DESC, aMonth DESC), ',', 1) AS lastpaidamount
FROM vw_extract
WHERE aAmount > 0
GROUP BY id

关于mysql - 让 SQL 选择最后一个非零金额,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19811547/

相关文章:

php - 递归函数和mysqli关闭错误

php - Mysql 限制列值重复N次

mysql - 为什么 "where not in"查询结果为 0

mysql - InnoDB 全文搜索(无 lucene)

sql - 使用 UNION 运算符在 SQL View 上创建索引?它真的会提高性能吗?

sql - 外键减慢删除

java - MariaDB 功能索引

mysql - 我可以使 MySQL 表的两个属性始终具有相同的值吗?

java - SQL 错误 : Closed Connection in java

php - 使用SQL以不同方式输出表