Использование функций SUM и CASE для получения ряда сумм - PullRequest
0 голосов
/ 26 июня 2019

Я хочу создать вывод, складывающий все целые числа, связанные с каждой переменной, которая соответствует определенному диапазону. Таким образом, один столбец - это диапазоны (0-99, 100-199 и т. Д.), Второй столбец содержит общее количество переменных, а третий столбец будет суммированием.

Я создал формат для создания первых двух столбцов, и для целей понимания моя цель - просто воссоздать ту же таблицу со вторым и третьим столбцами.

Ttable содержит список элементов, каждому из которых присвоено значение.

SELECT Ttable.SUM AS TotalTime,
        COUNT(*) AS Number

FROM 
    (SELECT 
    SUM(CASE WHEN count BETWEEN 0 AND 99 THEN [Value] ELSE 0 END) AS SUM FROM Ttable)
    (SELECT
    SUM(CASE WHEN count BETWEEN 100 AND 199 THEN [Value] ELSE 0 END) AS SUM FROM Ttable)
    (SELECT
    SUM(CASE WHEN count BETWEEN 200 AND 300 THEN [Value] ELSE 0 END) AS SUM FROM Ttable)
    Ttable
GROUP BY Ttable.SUM
ORDER BY Ttable.SUM;

Код возвращает столбцы один и два

SELECT  Ttable.RANGE AS FileRange,
        COUNT(*) AS Number
FROM (
    SELECT 
    CASE
        WHEN count BETWEEN 0 AND 99 THEN '0 - 99'
        WHEN count BETWEEN 100 AND 199 THEN '100 - 199'
        WHEN count BETWEEN 200 AND 300 THEN '200 - 299'
        ELSE '300-399' END AS RANGE FROM table)
    Ttable
GROUP BY Ttable.RANGE
ORDER BY Ttable.RANGE;

Я ожидаю, что код возвратит два и три столбца из

FileRange         Number        SumValues
 0 - 99            600            8000
100 - 199          400            5600
200 - 300          200            3000

но я получаю «Команда SQL не завершена должным образом»

Ответы [ 2 ]

0 голосов
/ 26 июня 2019

Просто сохраните исходный номер count в подзапросе SELECT, затем агрегируйте его во внешнем запросе:

SELECT  Ttable."RANGE" AS FileRange,
        COUNT(*) AS "Number",
        SUM("count") As SumValues
FROM (SELECT 
            "count",
            CASE
               WHEN "count" BETWEEN 0 AND 99 THEN '0 - 99'
               WHEN "count" BETWEEN 100 AND 199 THEN '100 - 199'
               WHEN "count" BETWEEN 200 AND 300 THEN '200 - 299'
               ELSE '300-399' 
             END AS "RANGE"
      FROM table) Ttable
GROUP BY Ttable."RANGE"
ORDER BY Ttable."RANGE";

Кроме того, будьте осторожны с зарезервированными словами , такими как таблица , count и диапазон , которые могут привести к непредвиденным результатам при компиляции запроса , Избегайте двойных кавычек или лучше используйте разные идентификаторы или псевдонимы.

0 голосов
/ 26 июня 2019

Вы, кажется, хотите условную агрегацию:

SELECT COUNT(*) AS Number
       SUM(CASE WHEN count BETWEEN 0 AND 99 THEN [Value] ELSE 0 END) AS SUM_000_0999
       SUM(CASE WHEN count BETWEEN 100 AND 199 THEN [Value] ELSE 0 END) AS SUM_100_199,
       SUM(CASE WHEN count BETWEEN 200 AND 300 THEN [Value] ELSE 0 END) AS SUM_200_300
FROM table;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...