如何从带条件的Varchar列的子字符串中查询最大整数值

时间:2019-06-26 06:08:36

标签: mysql sql

我想获得mybarcode列中最后五位数字定义的CODE列的最大总数。

  mybarcode  | code |  judge | create_date |
-------------+------+--------+-------------+
  M71X400001 |  7   |   pass |
  M71X400002 |  7   |   pass |
  M71X400005 |  7   |   pass |
  M71X400010 |  7   |   pass |
  M81X400001 |  8   |   pass |
  M81X400002 |  8   |   pass |
  M81X400007 |  8   |   pass |
  M91X400001 |  9   |   pass |
  M91X400003 |  9   |   pass |
    ```



Example:

>The maximum value of 7 from CODE column is 10 ( from M71X4'00010')  
>The maximum value of 8 from CODE column is 7  ( from M81X4'00007')  
>The maximum value of 9 from CODE column is 3  ( from M91X4'00003')  

The result should be 10+7+3=20.



并希望在下面的结果表中显示。


    ```

SELECT DAY, 
SUM(CASE WHEN judge = 'pass' then 1 else 0 end) pass,
SUM(CASE WHEN judge = 'fail' then 1 else 0 end) fail
  **??? as number**
from MYTABLE 
where MONTH(create_date) = '04' and YEAR(create_date) = '2019' 
GROUP BY DAY


Result Table
  day   | pass |  fail  |  number  |
--------+------+--------+----------+
   1    |   9  |   0    |    20    |
   2    |   9  |   0    |    ??    |
   3    |   9  |   0    |    ??    | 

1 个答案:

答案 0 :(得分:0)

我认为您需要分组两次。请尝试以下代码-

对于MySQL-

SELECT
    DAY,
    SUM(pass),
    SUM(fail),
    SUM(max_barcode)
FROM (
    SELECT
        DAY,
        SUM(CASE WHEN judge = 'pass' then 1 else 0 end) pass,
        SUM(CASE WHEN judge = 'fail' then 1 else 0 end) fail,
        Code,
        CAST(MAX(SUBSTRING(mybarcode, 5)) AS SIGNED) AS max_barcode
    FROM MYTABLE
    WHERE MONTH(create_date) = '%s' and YEAR(create_date) = '%s'
    GROUP BY DAY, Code
) AS CTE
GROUP BY DAY;

对于MS SQL Server-

;WITH CTE AS (
SELECT
    DAY,
    SUM(CASE WHEN judge = 'pass' then 1 else 0 end) pass,
    SUM(CASE WHEN judge = 'fail' then 1 else 0 end) fail,
    Code,
    max_barcode = cast(max(right(mybarcode, 5)) as int)
FROM MYTABLE
WHERE MONTH(create_date) = '%s' and YEAR(create_date) = '%s'
GROUP BY DAY, Code
)
SELECT
    DAY,
    SUM(pass),
    SUM(fail),
    SUM(max_barcode)
FROM CTE
GROUP BY DAY;