В моей таблице есть столбец datetime: DateOfDisc.

Мне нужно написать запрос, который создаст новый динамический столбец, который покажет четверть DateOfDisc в этом формате: «Q1», «Q2», «Q3», «Q4», следовательно:

если Месяц (DateOfDisc) равен 1, 2 или 3, то значение будет Q1
, если Месяц (DateOfDisc) равен 4, 5 или 6, тогда значение будет Q2
, если Месяц (DateOfDisc) равен 7, 8 или 9, тогда значение будет Q3
, если Месяц (DateOfDisc) равен 10, 11 или 12, тогда значение будет Q4

Как я могу этого добиться?

1
jonathana 8 Сен 2016 в 14:05

7 ответов

Лучший ответ

Вы можете напрямую использовать функцию DATEPART () с опцией Quarter, чтобы получить квартал, которому принадлежит дата

SELECT *, 'Q' + CAST(DATEPART(QUARTER, DateOfDisc) AS VARCHAR(1)) as Quarter
FROM TableName
2
Mudassir Hasan 8 Сен 2016 в 11:24

Ваше определение является стандартным определением для квартала, поэтому самый простой метод - использовать datename(), потому что это возвращает строку, а не число:

SELECT 'Q' + DATENAME(QUARTER, DateOfDisc) as Quarter

Если хотите, вы можете сделать этот столбец вычисляемым, чтобы он был доступен всем, кто использует эту таблицу:

ALTER TABLE t ADD Quarter as ('Q' + DATENAME(QUARTER, DateOfDisc));
3
Gordon Linoff 8 Сен 2016 в 11:25

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

alter table tablename add quarter as 'Q'||(2+Month(DateOfDisc))/3

Если вас беспокоит кастинг:

alter table tablename add quarter as 'Q'||cast((2+Month(DateOfDisc))/3 as varchar(1))
1
Christian MICHON 8 Сен 2016 в 12:01

Вы можете использовать DATEPART. См. Пример:

WITH Src AS
(
    SELECT DATEADD(MONTH, M, '2016-01-01') SomeDate
    FROM (VALUES (0),(1),(2),(3),(4),(5),(6),(7),(8),(9),(10),(11)) T(M)
)
SELECT SomeDate, 'Q'+CONVERT(varchar,DATEPART(QUARTER, SomeDate)) [Quarter]
FROM Src

Это дает:

SomeDate                  Quarter
-----------------------   -------
2016-01-01 00:00:00.000   Q1
2016-02-01 00:00:00.000   Q1
2016-03-01 00:00:00.000   Q1
2016-04-01 00:00:00.000   Q2
2016-05-01 00:00:00.000   Q2
2016-06-01 00:00:00.000   Q2
2016-07-01 00:00:00.000   Q3
2016-08-01 00:00:00.000   Q3
2016-09-01 00:00:00.000   Q3
2016-10-01 00:00:00.000   Q4
2016-11-01 00:00:00.000   Q4
2016-12-01 00:00:00.000   Q4
1
Paweł Dyl 8 Сен 2016 в 11:12

Предположим, у вас есть таблица доходов и вы хотите получить разделение на 4 квартала.

date       | revenue | division
-----------|---------|---------
2018-01-20 | 1500000 | chemo
2019-02-21 | 1200000 | agri
2019-04-09 | 390900  | pharma
CREATE TABLE revn 
(
  date  DATE,
  rev  INTEGER,
  division TEXT
);


INSERT INTO revn (date, rev, division)
VALUES
    ("2018-01-20", 1500000, "D1"),
    ("2019-02-21", 1200000, "d2"),
    ("2019-04-09", 390900, "d3")
    ("2019-04-09", 390900, "d4");

Есть функция под названием QUARTER(col_name), , см. Документацию w3school , которая Пригодятся в этом случае вот такие:

SELECT (
  SELECT QUARTER(date) 
) AS q, rev
FROM revn;

Результат должен быть:

**[Results][2]**:

    | q |     rev |
    |---|---------|
    | 1 | 1500000 |
    | 1 | 1200000 |
    | 2 |  390900 |
    | 2 |  390900 |

0
Salma 3 Июл 2020 в 18:04

Вы также можете попробовать это:

SELECT 
    CASE WHEN DATEPART(MM, Edate) BETWEEN 1 AND 3 THEN 'Q1'
        WHEN DATEPART(MM, Edate) BETWEEN 3 AND 6 THEN 'Q2'
        WHEN DATEPART(MM, Edate) BETWEEN 6 AND 9 THEN 'Q3' 
    ELSE 'Q4'
    END
FROM #TableName
2
Susang 8 Сен 2016 в 11:19

Добавьте вычисляемый столбец, чтобы данные всегда согласовывались:

alter table tablename
    add q as case when Month(DateOfDisc) in (1,2,3) then 'Q1'
                  when Month(DateOfDisc) in (4,5,6) then 'Q2'
                  when Month(DateOfDisc) in (7,8,9) then 'Q3'
                  when Month(DateOfDisc) in (10,11,12) then 'Q4'
             end
1
jarlh 8 Сен 2016 в 11:08