Количество строк SQL ГРУППИРУЕТСЯ ПО Названию месяца

#sql #sql-server #entity-framework #tsql

Вопрос:

У меня есть таблица, и она имеет следующую структуру:

    DEVICE_ID |    DATE    |  STATUS
------------------------------------------
       1     | 2021/01/05 | accepted
       2     | 2021/01/23 | success
       3     | 2021/02/07 | success
       4     | 2021/03/11 | accepted
       5     | 2021/03/20 | unsuccess
       6     | 2021/03/26 | success
 

Я хочу рассчитать количество записей в 2021 году по статусу и GROUP BY названию месяца, как это :

      MONTH    | ACCEPTED | SUCCESS | UNSUCCESS 
------------------------------------------------
    January   |    1     |    1    |     0
    February  |    0     |    1    |     0
    March     |    1     |    1    |     1
    April     |    0     |    0    |     0
    May       |    0     |    0    |     0
    June      |    0     |    0    |     0
    July      |    0     |    0    |     0
    August    |    0     |    0    |     0
    September |    0     |    0    |     0
    October   |    0     |    0    |     0
    November  |    0     |    0    |     0
    December  |    0     |    0    |     0
 

Пожалуйста, помогите мне решить эту проблему

Комментарии:

1. Я подозреваю, что голосование против-это потому, что вы не показали, что вы пробовали до сих пор. Вот несколько советов, с которых вы можете начать: вы можете использовать ROW_NUMBER для получения идентификатора УСТРОЙСТВА, ИМЯ ДАТЫ(месяц, [ДАТА]) для получения названия месяца и СВОДКУ, чтобы разделить его на столбцы.

2. @RussellFox Я не согласен (хотя это тоже был не я). Причина снижения голоса очевидна из всплывающего окна на стрелке. И в данном случае это полностью оправдано. Никаких видимых усилий, и вопрос неясен, потому что вопроса нет. Непонятно, что мешает операторам делать то, что они хотят. Кроме того, некоторые люди чувствуют себя сильно оскорбленными, когда их голосуют против (к счастью, не здесь), и вымещают это на том, кто осмеливается объяснить. Это непрофессионально.

3. @DaleK Спасибо, дорогой друг, приведенные ниже ответы работают, но моя проблема в формате даты, мой формат даты в персидском календаре, а год 1400, поэтому sql server показывает сообщение, которое находится вне зоны действия

4. @Хадираджаби задай новый вопрос.

Ответ №1:

Объяснение — поскольку вам нужен полный список месяцев, вам нужно, чтобы все 12 месяцев были где-то в данных. Затем вы хотите, чтобы настраиваемые столбцы состояния отображались так, как вы просили.

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

 IF OBJECT_ID('TempDb..#tmp') IS NOT NULL DROP TABLE #tmp;
IF OBJECT_ID('TempDb..#tmp2') IS NOT NULL DROP TABLE #tmp2;

CREATE TABLE #tmp
    (
        Device_ID INT
        , Date VARCHAR(12)
        , Status VARCHAR(15)
    )
;

CREATE TABLE #tmp2
    (
        MOnthName VARCHAR(25)
    )
;

INSERT INTO #tmp2 
    (MonthName) 
VALUES
    ('January'),
    ('February'),
    ('March'),
    ('April'),
    ('May'),
    ('June'),
    ('July'),
    ('August'),
    ('September'),
    ('October'),
    ('November'),
    ('December')
;

INSERT INTO #tmp
    (
        Device_ID
        , Date
        , Status
    )
VALUES
    (1,'2021/01/05','accepted'),
    (2,'2021/01/23','success'),
    (3,'2021/02/07','success'),
    (4,'2021/03/11','accepted'),
    (5,'2021/03/20','unsuccess'),
    (6,'2021/03/26','success')
;

SELECT 
    MOnthName
    , success
    , accepted
    , unsuccess
FROM
    (
        SELECT
            tt.MonthName
            , Status
        FROM 
            #tmp2 tt
            LEFT JOIN #tmp t ON tt.MOnthName = DATENAME(month, CAST(Date AS DATE))
        GROUP BY
            tt.MonthName 
            , Status
    ) AS SourceTable
PIVOT
    (
        COUNT(Status) FOR Status IN ([accepted], [success], [unsuccess])
    ) AS PivotTable
ORDER BY
    CASE 
        WHEN MonthName ='January' THEN 1
        WHEN MonthName ='February' THEN 2
        WHEN MonthName ='March' THEN 3
        WHEN MonthName ='April' THEN 4
        WHEN MonthName ='May' THEN 5
        WHEN MonthName ='June' THEN 6
        WHEN MonthName ='July' THEN 7
        WHEN MonthName ='August' THEN 8
        WHEN MonthName ='September' THEN 9
        WHEN MonthName ='October' THEN 10
        WHEN MonthName ='November' THEN 11
        WHEN MonthName ='December' THEN 12
END
 

Комментарии:

1. Спасибо, Дорогой За Быстрый Ответ , мой тип поля Даты-Varchar, Пожалуйста, помогите преобразовать в дату

2. @HadiRajabi просто измените его на varchar и приведите varchar к дате, когда вы получаете ИМЯ ДАТЫ(ПРИВЕДЕНИЕ(дата как дата))

3. Актерский состав в порядке, теперь мне нужно ограничиться текущим годом, и как я могу изменить названия месяцев в моей культуре?

4. @HadiRajabi, ограничивающийся текущим годом, должен быть eays в предложении where в основном запросе. Вы можете буквально сказать, ГДЕ Дата>=’1/1/2021′ или ГДЕ Дата>>’1/1/’ ГОД(ДАТА ПОЛУЧЕНИЯ())

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

Ответ №2:

  create table yourtable(DEVICE_ID int, DATE date, STATUS varchar(50));
 
 insert into yourtable values(1, '2021/01/05' , 'accepted');
 insert into yourtable values(2, '2021/01/23' , 'success');
 insert into yourtable values(3, '2021/02/07' , 'success');
 insert into yourtable values(4, '2021/03/11' , 'accepted');
 insert into yourtable values(5, '2021/03/20' , 'unsuccess');
 insert into yourtable values(6, '2021/03/26' , 'success');
 

Запрос:

  ;WITH months(MonthNumber) AS
 (
     SELECT 0
     UNION ALL
     SELECT MonthNumber 1 
     FROM months
     WHERE MonthNumber < 11
 )
 SELECT DATENAME(MONTH,DATEADD(MONTH,MonthNumber,'01-01-2021')) AS [month],
 coalesce(sum(case when status='ACCEPTED' then 1 end),0) ACCEPTED,
 coalesce(sum(case when status='SUCCESS' then 1 end),0) SUCCESS,
 coalesce(sum(case when status='UNSUCCESS' then 1 end),0) UNSUCCESS
 
 FROM months m left join yourtable y
 on m.monthnumber=month(y.[date])-1
 group by monthnumber
 

Выход:

месяц принято успех неуспех
Январь 1 1 0
Февраль 0 1 0
Март 1 1 1
Апрель 0 0 0
Май 0 0 0
Июнь 0 0 0
Июль 0 0 0
Август 0 0 0
Сентябрь 0 0 0
Октябрь 0 0 0
Ноябрь 0 0 0
Декабрь 0 0 0

бд<>скрипка <>здесь

Комментарии:

1. Большое вам спасибо За Быстрый ответ, тип моего поля даты — «строка», как я могу преобразовать в дату без изменения структуры?

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

3. Какими будут ваши желаемые названия месяцев?

4. мой календарь-Шамси (Джалали), и названия месяцев выглядят так: 1 = «Фарвардин» 2 = «Ордибехешт» 3 = «Хордад» 4 = «Тир» ….