Разделить число на диапазоны в SQL - PullRequest
2 голосов
/ 24 мая 2019

Я пытаюсь написать запрос SQL, показывающий распределение стажа работы клиентов с 2015/01/31 года:

  1. До одного месяца
  2. От одного до шести месяцев
  3. От шести месяцев до одного года
  4. За год

Мне удалось разделить и сгруппировать количество месяцев клиентов.

SELECT Seniority, COUNT(Customer_ID) [Number of Customers]
FROM
(SELECT Customer_ID,
DATEDIFF(MONTH, MIN(CONVERT(datetime, Order_Date)), '2015/01/31') Seniority
FROM Orders
GROUP BY Customer_ID) t
GROUP BY Seniority

enter image description here

Как разделить на заданные диапазоны?

Ожидается:

        Seniorty                |   Number of Customers
Up to one month                 |            0
Between one and six months      |            14
Between six months and one year |            1
Over a year                     |            0

Ответы [ 2 ]

2 голосов
/ 24 мая 2019

Использовать условное агрегирование:

WITH cte AS (
    SELECT
        'Up to one month' AS Seniority,
        COUNT(CASE WHEN DATEDIFF(MONTH, Order_Date, '2015-01-31') < 1 THEN 1 END) AS [Number of Customers],
        1 AS position
    FROM Orders
    UNION ALL
    SELECT
        'Between one and six months',
        COUNT(CASE WHEN DATEDIFF(MONTH, Order_Date, '2015-01-31') >= 1 AND
                        DATEDIFF(MONTH, Order_Date, '2015-01-31') < 6 THEN 1 END),
        2
    FROM Orders
    UNION ALL
    SELECT
        'Between six months and one year',
         COUNT( CASE WHEN DATEDIFF(MONTH, Order_Date, '2015-01-31') >= 6 AND
                        DATEDIFF(MONTH, Order_Date, '2015-01-31') < 12 THEN 1 END),
         3
    FROM Orders
    UNION ALL
    SELECT
        'Over a year',
        COUNT(CASE WHEN DATEDIFF(MONTH, Order_Date, '2015-01-31') > 12 THEN 1 END),
        4
    FROM Orders
)

SELECT
    Seniority,
    [Number of Customers]
FROM cte
ORDER BY
    position;

В этом ответе предполагается, что в столбце Order_Date уже указана дата или дата / время.Если нет, то первое, что вы должны сделать, - преобразовать этот столбец в фактический тип даты.

1 голос
/ 24 мая 2019
WITH CTE AS (
    SELECT CUSTOMER_ID,
           CASE WHEN DATEDIFF(MONTH,'2015-01-31',ORDER_DATE)=1 THEN 'Up to one month'
               WHEN DATEDIFF(MONTH,'2015-01-31',ORDER_DATE) BETWEEN 1 AND 6 THEN 'Between one and six months'
               WHEN DATEDIFF(MONTH,'2015-01-31',ORDER_DATE) BETWEEN 6 AND 12 THEN 'Between six months and one year'
               WHEN DATEDIFF(MONTH,'2015-01-31',ORDER_DATE)>12 THEN 'Over a year'
           END AS SENIORITY
      FROM ORDERS 
     )
SELECT SENIORITY AS 'Seniority', COUNT(CUSTOMER_ID) AS 'Number of Customers'
FROM CTE
WHERE SENIORITY IS NOT NULL
GROUP BY SENIORITY
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...