mysql - 对数字范围 mysql 执行计算

标签 mysql sql select pivot range

是否可以在 MySQL 中使用数字范围?如果可以,完成以下任务的最佳方法是什么。

  1. 我有两个表格列的范围。
+------+-------+--------+
| Col1 | Col2  | Action |
+------+-------+--------+
| 1    | 100   | Add    |
+------+-------+--------+
  1. 接下来,我想减去范围 [60,65],减去范围 [20, 40] 并加上范围 [200,210]。所以我将这些记录添加到我的表中。
+------+-------+--------+
| Col1 | Col2  | Action |
+------+-------+--------+
| 1    | 100   | Add    |
| 60   | 65    | Subtr  |
| 20   | 40    | Subtr  |
| 200  | 210   | Add    |
+------+-------+--------+
  1. 最后,我想检索剩余的范围。查询应返回类似这样的内容。
+------+-------+
| Col1 | Col2  |
+------+-------+
| 1    | 19    |
| 41   | 59    |
| 66   | 100   |
| 200  | 210   |
+------+-------+

额外信息

  • 业务逻辑防止范围重叠
  • 业务逻辑防止减去不在可用范围内的范围

最佳答案

试试这个:

SELECT (CASE WHEN Action1 = 'Add' THEN col1 
             WHEN Action1 = 'Subtr' THEN col1 + 1 
             ELSE 0 
        END) col1, 
       (CASE WHEN Action2 = 'Add' THEN col2 
             WHEN Action2 = 'Subtr' THEN col2 - 1 
             ELSE 0 
        END) col2
FROM (SELECT CEILING(RowNum / 2) AS RowId, 
             MAX(CASE WHEN RowNum % 2 = 1 THEN col ELSE 0 END) AS col1, 
             MAX(CASE WHEN RowNum % 2 = 1 THEN Action ELSE '' END) AS Action1,         
             MAX(CASE WHEN RowNum % 2 = 0 THEN col ELSE 0 END) AS col2, 
             MAX(CASE WHEN RowNum % 2 = 0 THEN Action ELSE '' END) AS Action2
      FROM (SELECT (@id:=@id+1) AS RowNum, col, Action 
            FROM (SELECT col1 AS col, Action 
                  FROM tableA 
                  UNION 
                  SELECT col2 AS col, Action 
                  FROM tableA 
                 ) AS A, 
                 (SELECT @id:=0) AS B
            ORDER BY col
           ) AS A
      GROUP BY RowId
     ) AS A;

检查这个SQL FIDDLE DEMO

输出

| COL1 | COL2 |
|------|------|
|    1 |   19 |
|   41 |   59 |
|   66 |  100 |
|  200 |  210 |

::解释::

正如您在我的查询中看到的那样,首先我获取了单列中的所有开始范围和结束范围及其操作类型,然后为每条记录提供了一个行号以将该数据转置为两列,因为我想创建内表如下:

| ROWID | COL1 | ACTION1 | COL2 | ACTION2 |
|-------|------|---------|------|---------|
|     1 |    1 |     Add |   20 |   Subtr |
|     2 |   40 |   Subtr |   60 |   Subtr |
|     3 |   65 |   Subtr |  100 |     Add |
|     4 |  200 |     Add |  210 |     Add |

最后我使用了 CASE 语句来生成特定的输出。

关于mysql - 对数字范围 mysql 执行计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27585801/

相关文章:

php - 在 Laravel 中计算后从 mysql 表检索 id 时出现问题

两个表的 SQL 不同查询

sql - 带有 age() 函数的 Postgresql WHERE

javascript - jQuery - 选择有 child 的 parent

javascript - 如果选择了第一个选项,如何禁用第二个选项

php - 无法连接服务器上的MySQL

mysql - 为什么我的 SQL 查询会使结果翻倍

php - mysql_fetch_array无法获取类别id信息

mysql - 如何计算MySQL中的相似兴趣

mysql select into outfile 没有任何行终止字符