Как использовать GROUP BY для расчета интервалов - PullRequest
1 голос
/ 06 февраля 2012

пожалуйста, рассмотрите это изображение:

enter image description here

У меня есть такая таблица:

 Age              Active            Men/Women
 -------------------------------------------------

Я хочу написать запрос, который вычисляет Countвсех возрастных интервалов для мужчин и женщин. Я не знаю, как я могу использовать GROUP BY и интервалы.

в своих отчетах в левой части изображения выше, я хочу вычислить UnActive строк. Как я могуможно объединить это для запроса к одному запросу?

спасибо

Ответы [ 5 ]

2 голосов
/ 06 февраля 2012
SELECT
    Active.State,
    Age.Base, Age.Base+4,
    COUNT(*) AS TotalCount,
    COUNT(CASE WHEN T.[Men/Women] = 'man' THEN 1 END) AS ManCount,
    COUNT(CASE WHEN T.[Men/Women] = 'woman' THEN 1 END) AS WomanCount
FROM
    (
    VALUES (10),(15),(20),(25),(30),(35),(40) /*.. add the rest */,(90),(95)
    ) AS Age(base)
    CROSS JOIN
    (
    VALUES (0), (1)
    ) AS Active(State)
    LEFT JOIN
    MyTable T ON T.Age BETWEEN Age.Base AND Age.Base+4 AND T.Active = Active.State
GROUP BY
    Active.State,
    Age.Base, Age.Base+4;

После этого вы можете отформатировать его так, как вы хотите

Отредактировано для создания пустых диапазонов

1 голос
/ 06 февраля 2012

Как уже упоминали другие, это попытка сообщить о способе, который совсем не совпадает с вашими данными.

Но я думаю, что лучший способ достичь этого в SQL - это создать скалярную функцию (propsв @gbn для логики минимального / максимального возрастного диапазона):

CREATE FUNCTION usvf_calculate_age_bracket
(
    -- Add the parameters for the function here
    @age INT
)
RETURNS VARCHAR(50)
AS
BEGIN
    -- Return the result of the function
    RETURN CAST(@age/5*5 AS VARCHAR(20)) + '-' + CAST(@age/5*5+4 AS VARCHAR(20))
END
GO

Тогда в вашем запросе вы можете сделать:

SELECT SUM(CASE WHEN gender = 'F' THEN active ELSE 0 END) AS [Women],
    SUM(CASE WHEN gender = 'M' THEN active ELSE 0 END) AS [Men], 
    SUM(CAST(active AS int)) AS [Total],
    'Age ' + dbo.usvf_calculate_age_bracket(age) AS [Age]
FROM myTable
GROUP BY dbo.usvf_calculate_age_bracket(age)

Мой тестовый код:

DECLARE @T TABLE
(
age int,
active bit,
gender char(1)

)

INSERT INTO @T VALUES (25, 1, 'M'),(32, 0, 'F'),(21, 1, 'M'),(22, 1, 'F'),(28, 1, 'F'),(32, 0, 'M'), (23, 1, 'M'),(42, 0, 'F'),(29, 1, 'M'),(29, 1, 'F'),(28, 1, 'F'),(32, 1, 'M')

SELECT SUM(CASE WHEN gender = 'F' THEN active ELSE 0 END) AS [Women],
SUM(CASE WHEN gender = 'M' THEN active ELSE 0 END) AS [Men], 
SUM(CAST(active AS int)) AS [Total],
'Age ' + dbo.usvf_calculate_age_bracket(age) AS [Age] FROM @T
GROUP BY dbo.usvf_calculate_age_bracket(age)

Результаты:

Women Men Total Age
1    2    3     Age 20-24
3    2    5     Age 25-29
0    1    1     Age 30-34
0    0    0     Age 40-44

Что похоже на то, что вам нужно, и это не слишком сложный SQL-запрос для достижения этой цели.(за исключением того, что я не могу определить ваш «итоговый» столбец)

1 голос
/ 06 февраля 2012

Это должно работать:

SELECT SUM(CASE WHEN [Men/Women] = 'M' THEN 1 ELSE 0 END) AS Men,
 SUM(CASE WHEN [Men/Women] = 'W' THEN 1 ELSE 0 END) AS Women,
 COUNT(*) as Total,
 CASE WHEN Age BETWEEN 10 AND 14 THEN 'Age 10-14'
    WHEN Age BETWEEN 15 AND 19 THEN 'Age 15-19'
    WHEN Age BETWEEN 20 AND 24 THEN 'Age 20-24'
    ELSE 'Old'
END Age
FROM MyTable
WHERE Active = 1
GROUP BY     CASE WHEN Age BETWEEN 10 AND 14 THEN 'Age 10-14'
    WHEN Age BETWEEN 15 AND 19 THEN 'Age 15-19'
    WHEN Age BETWEEN 20 AND 24 THEN 'Age 20-24'
    ELSE 'Old'
END
1 голос
/ 06 февраля 2012

Вы действительно можете расширить то, что предоставила Андреа ...

SELECT
    CASE WHEN YT.AGE BETWEEN 15 AND 19 THEN 'Age 15-19'
         WHEN YT.AGE BETWEEN 20 AND 24 THEN 'Age 20-24'
         ELSE 'Other'
    END AGE_INTERVAL,
    SUM( CASE WHEN YT.Active THEN 1 ELSE 0 END ) as ActiveCount,
    SUM( CASE WHEN YT.Gender = 'M' THEN 1 ELSE 0 END ) as MaleCount,
    SUM( CASE WHEN YT.Gender = 'F' THEN 1 ELSE 0 END ) as FemaleCount,
    COUNT(*) AgeGroupCount
FROM
    YourTable YT
GROUP BY
   Age_Interval
1 голос
/ 06 февраля 2012

Вы можете GROUP BY на возрастных интервалах CASE:

SELECT
    COUNT(*) AGE_COUNT,
    CASE WHEN AGE BETWEEN 15 AND 19 THEN 'Age 15-19'
         WHEN AGE BETWEEN 20 AND 24 THEN 'Age 20-24'
         ELSE 'Other'
    END AGE_INTERVAL
FROM
    YOUR_TABLE
GROUP BY
    CASE WHEN AGE BETWEEN 15 AND 19 THEN 'Age 15-19'
         WHEN AGE BETWEEN 20 AND 24 THEN 'Age 20-24'
         ELSE 'Other'
    END    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...