Как создать запрос SQL, который группирует по диапазонам значений - PullRequest
0 голосов
/ 08 мая 2009

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

20% значений от 10 до 20

40% значений от 20 до 32,5

Сервер - MSSQL

Ответы [ 7 ]

2 голосов
/ 08 мая 2009
SELECT B.Description, Total = COUNT(*) / CONVERT(money, (SELECT COUNT(*) FROM Target T2))
FROM Target T
JOIN (
    SELECT  Description = '0 to 10', LBound = 0, UBound = 10 
    UNION ALL 
    SELECT Description = '10 to 20', LBound = 10, UBound = 20
) B ON T.Value >= LBound AND T.Value < B.UBound
GROUP BY B.Description
2 голосов
/ 08 мая 2009

Это даст вам счет за диапазон, вы можете легко определить процент оттуда:

declare @ranges table (beginInclusive float, endExclusive float)
insert @ranges (beginInclusive, endExclusive)
    select 10, 20
    union all select 20, 32.5

select
    r.beginInclusive,
    r.endExclusive,
    count(*)
from t join @ranges on t.RangedValue >= r.beginInclusive and t.RangedValue < r.endExclusive
group by 
    r.beginInclusive,
    r.endExclusive    
2 голосов
/ 08 мая 2009
GROUP BY CASE 
         WHEN VALUE >= 10 AND VALUE <= 20 THEN '20%'
         WHEN VALUE > 20 AND VALUE <= 32.5 THEN '40%' ELSE '0' END

Вам необходимо охватить всех возможных значений, следовательно, ELSE 0. Возможно, вы захотите сделать что-то немного другое, но это должно дать вам начало.


На основании комментария Жоэля Говро:

SUM(CASE WHEN VALUE >=10 AND VALUE <= 20 THEN 1.0 ELSE 0.0 END) / COUNT(*),
SUM(CASE WHEN VALUE > 20 AND VALUE <= 32.5 THEN 1.0 ELSE 0.0 END) / COUNT(*)

Или в конце запроса используйте оператор COMPUTE.

0 голосов
/ 09 мая 2009

Ответ Джоэла кажется мне лучшим способом. Публикация для объяснения запроса, а также потому, что в ответе содержится целое число / сумма деления, которая будет возвращать 1 или 0 вместо процента.

Для диапазона 20 -> 32,5:

select CAST(SUM(
    CASE WHEN 20 < field AND field <= 32.5 THEN 1 ELSE 0 END
    ) as float) / COUNT(*) * 100.0
from table

Случай возвращает 1, когда значение находится в диапазоне. Поскольку нет предложения group by, к сумме добавляется результат case для каждой строки таблицы. Конвертировать в float, разделить на количество строк = count (*), и вы получите процент.

Вы также можете написать это как:

select SUM(
    CASE WHEN 20 < field AND field <= 32.5 THEN 1.0 ELSE 0.0 END
    ) / COUNT(*) * 100
from table

Здесь CASE приведет к появлению числа с плавающей запятой 1.0 вместо целого числа 1.

0 голосов
/ 08 мая 2009

Если это то, чем вы будете заниматься регулярно, то вы можете создать таблицу с диапазонами и их составами. Если нет, вы можете установить их в табличную переменную или временную таблицу и присоединиться к ней. В основном это решение JohnOpincar, но с таблицей вместо подзапроса.

Кроме того, в вашем примере вы перечисляете «от 10 до 20» и «от 20 до 32,5». Где считается строка, если она ровно 20? Вам, вероятно, следует убедиться, что ваши требования ясны по этому вопросу, прежде чем вы предоставите окончательное решение.

0 голосов
/ 08 мая 2009
Declare @1 as int
Declare @2 as int
Declare @TotalRows as int

set @1 = (Select COUNT(id) FROM dbo.Table_1 WHERE id >= 10 and id <= 20)
set @2 = (Select COUNT(id) FROM dbo.Table_1 WHERE id > 20 AND id <= 32.5);
set @TotalRows = (Select Count(id) from dbo.Table_1);

SELECT CAST(((@1 * 100)/@TotalRows) as nvarchar(32)) + '%', CAST(((@2 * 100)/@TotalRows) as nvarchar(32)) + '%';

Немного сложно, но это работает ... полагаю ...

dbo.Table_1 имеет только 1 столбец, id и имеет тип int.

0 голосов
/ 08 мая 2009

Обычно я использую подзапрос, получаю счетчики диапазонов и присоединяюсь к итогу, чтобы получить процент Что-то вроде:

SELECT 
  RangeCount/CNT as Percentage,
  Range
FROM 
(
SELECT
  Count(*) AS CNT
FROM
  SomeTable
) AS Total
LEFT JOIN 
(
SELECT
  CASE Val <= 10 then
       '0 up to 10'
  ELSE 
       CASE when Val <= 20
         '11 to 20'
       ELSE 
        '> 20'
       END
    END
  END AS Range,
  COUNT(*) AS RangeCount
FROM 
   SomeTable
GROUP BY
   Range
) AS RangeTotals
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...