Когда требуется приведение типов столбцов SQL? - PullRequest
0 голосов
/ 25 сентября 2018

Я выполнил первый запрос и не получил ожидаемых результатов.Затем я понял, что 1 slope интерпретировалось как целое число, поэтому t.slope в t.slope*pchp.sign*p.slope slope, t.intercept+t.slope*pchp.sign*p.intercept intercept также действовало как целое число.

Затем я повторил запрос, но на этот раз произвел и slope, и * 1007.* как десятичные дроби, и получил правильные результаты.

Затем я повторил запрос во второй раз, но только с приведенным временем slope, значение которого было не нулевым, но не intercept, а также получил правильные результаты.

Что приводит меня к моему вопросу.Когда требуется преобразование типов в столбцы SQL?

MariaDB [testing]> WITH RECURSIVE t AS (
    -> SELECT id, id pointsId, type, 0 value, 0 prevValue, 1 slope, 0 intercept
    -> FROM points
    -> WHERE id IN (406, 428)
    -> UNION ALL
    -> SELECT t.id, pchp.pointsId, p.type, p.value, p.prevValue, t.slope*pchp.sign*p.slope slope, t.intercept+t.slope*pchp.sign*p.intercept intercept
    -> FROM t
    -> INNER JOIN points_custom_has_points pchp ON pchp.pointsCustomId=t.pointsId
    -> INNER JOIN points p ON p.id=pchp.pointsId
    -> )
    -> SELECT id, SUM(slope*value+intercept) value, SUM(slope*prevValue+intercept) prevValue FROM t WHERE type='real' GROUP BY id;
+-----+--------+-----------+
| id  | value  | prevValue |
+-----+--------+-----------+
| 406 |      0 |         0 |
| 428 | 123702 |    123702 |
+-----+--------+-----------+
2 rows in set (0.00 sec)

MariaDB [testing]> WITH RECURSIVE t AS (
    -> SELECT id, id pointsId, type, 0 value, 0 prevValue, CAST(1 AS DECIMAL(12,4)) slope, CAST(0 AS DECIMAL(12,4)) intercept
    -> FROM points
    -> WHERE id IN (406, 428)
    -> UNION ALL
    -> SELECT t.id, pchp.pointsId, p.type, p.value, p.prevValue, t.slope*pchp.sign*p.slope slope, t.intercept+t.slope*pchp.sign*p.intercept intercept
    -> FROM t
    -> INNER JOIN points_custom_has_points pchp ON pchp.pointsCustomId=t.pointsId
    -> INNER JOIN points p ON p.id=pchp.pointsId
    -> )
    -> SELECT id, SUM(slope*value+intercept) value, SUM(slope*prevValue+intercept) prevValue FROM t WHERE type='real' GROUP BY id;
+-----+-------------+-------------+
| id  | value       | prevValue   |
+-----+-------------+-------------+
| 406 |  49480.8000 |  49480.8000 |
| 428 | 123702.0000 | 123702.0000 |
+-----+-------------+-------------+
2 rows in set (0.00 sec)

MariaDB [testing]> WITH RECURSIVE t AS (
    -> SELECT id, id pointsId, type, 0 value, 0 prevValue, CAST(1 AS DECIMAL(12,4)) slope, 0 intercept
    -> FROM points
    -> WHERE id IN (406, 428)
    -> UNION ALL
    -> SELECT t.id, pchp.pointsId, p.type, p.value, p.prevValue, t.slope*pchp.sign*p.slope slope, t.intercept+t.slope*pchp.sign*p.intercept intercept
    -> FROM t
    -> INNER JOIN points_custom_has_points pchp ON pchp.pointsCustomId=t.pointsId
    -> INNER JOIN points p ON p.id=pchp.pointsId
    -> )
    -> SELECT id, SUM(slope*value+intercept) value, SUM(slope*prevValue+intercept) prevValue FROM t WHERE type='real' GROUP BY id;
+-----+-------------+-------------+
| id  | value       | prevValue   |
+-----+-------------+-------------+
| 406 |  49480.8000 |  49480.8000 |
| 428 | 123702.0000 | 123702.0000 |
+-----+-------------+-------------+
2 rows in set (0.00 sec)

MariaDB [testing]>

Определения таблиц следующие:

MariaDB [testing]> explain points;
+----------------+-------------+------+-----+---------+----------------+
| Field          | Type        | Null | Key | Default | Extra          |
+----------------+-------------+------+-----+---------+----------------+
| id             | int(11)     | NO   | PRI | NULL    | auto_increment |
| idPublic       | int(11)     | NO   | MUL | 0       |                |
| accountsId     | int(11)     | NO   | MUL | NULL    |                |
| name           | varchar(45) | NO   | MUL | NULL    |                |
| value          | float       | YES  |     | NULL    |                |
| prevValue      | float       | YES  |     | NULL    |                |
| units          | varchar(45) | YES  |     | NULL    |                |
| type           | char(8)     | NO   | MUL | NULL    |                |
| slope          | float       | NO   |     | 1       |                |
| intercept      | float       | NO   |     | 0       |                |
| tsValueUpdated | datetime    | YES  |     | NULL    |                |
| sourceTypeId   | tinyint(4)  | YES  | MUL | NULL    |                |
+----------------+-------------+------+-----+---------+----------------+
12 rows in set (0.00 sec)

MariaDB [testing]> explain points_custom_has_points;
+----------------+------------+------+-----+---------+-------+
| Field          | Type       | Null | Key | Default | Extra |
+----------------+------------+------+-----+---------+-------+
| pointsCustomId | int(11)    | NO   | PRI | NULL    |       |
| pointsId       | int(11)    | NO   | PRI | NULL    |       |
| sign           | tinyint(4) | NO   | MUL | 1       |       |
+----------------+------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

MariaDB [testing]>

1 Ответ

0 голосов
/ 08 октября 2018

Измените CAST(1 AS DECIMAL(12,4)) slope на 1.0 slope.Если это работает, то вот объяснение:

first SELECT в UNION определяет тип данных каждого столбца.Таким образом, просто сказав 1, вы зададите наклон целого числа (я думаю BIGINT).

У вас могут быть похожие проблемы с другими столбцами.

Я подозреваю, что вы не можете поменяться местамиSELECTs в этом UNION из-за WITH.Но это может быть еще одна вещь, чтобы попробовать.(Пожалуйста, сообщите, если вы попробуете.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...