Увеличение значения столбцов на основе записи о двойственности - PullRequest
1 голос
/ 28 октября 2019

У меня есть вопрос, могу ли я избежать использования курсора.

У меня есть таблица с тысячами записей, подобная этой:

   Date    | Name  | StateData | 
-----------+-------+-----------+  
22-10-2019 | Tom   | OPENED    |   
22-10-2019 | David | NULL      |
22-10-2019 | Tom   | NULL      |
22-10-2019 | Brand | CLOSED    |
22-10-2019 | Tom   | NULL      |
23-10-2019 | Brand | NULL      |
22-10-2019 | Brand | OPENED    |
22-10-2019 | Tom   | OPENED    |
22-10-2019 | Brand | OPENED    |
22-10-2019 | Tom   | CLOSED    |
22-10-2019 | Brand | CLOSED    |

Чего бы я хотел достичьэто результат, где я могу видеть каждое имя только в 1 строке с подсчетом, сколько раз у них было какое состояние "StateData".

      Date | Name | OPENED | CLOSED | UNUSED |
-----------+------+--------+--------+--------+
22-10-2019 | Tom  |   2    |    1   |    2   |
22-10-2019 | David|   0    |    0   |    1   |
22-10-2019 | Brand|   2    |    2   |    1   |

Я пробовал подобный выбор

SELECT DISTINCT d.Name, d.[opened], d.[closed], d.[unused], StateData
FROM [dbo].[StateData] d

INNER JOIN (
        SELECT  DISTINCT Name, [opened], [closed], [unused]

        FROM [dbo].[StateData]
        GROUP BY  Name, [opened], [closed], [unused]

        ) dp
            ON dp.Name = d.Name 
;

Я знаю, что это можно сделать с помощью создания хранимой процедуры с помощью CURSOR, но я не настолько опытен с курсором.

Ответы [ 3 ]

4 голосов
/ 28 октября 2019

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

select 
    Date,
    Name,
    SUM(CASE WHEN StateDAte = 'Opened' THEN 1 ELSE 0 END) Opened,
    SUM(CASE WHEN StateDAte = 'Closed' THEN 1 ELSE 0 END) Closed,
    SUM(CASE WHEN StateDAte IS NULL THEN 1 ELSE 0 END) Unused
from mytable
group by Date, Name 
1 голос
/ 28 октября 2019

Вы можете использовать sql pivot следующим образом

;with cte as (select date,name,isnull(statedate,'unused') statedate from mytable)


select p.*  from cte 
pivot
(count(statedate) for statedate in ([Opened],[Closed], [unused]  )) as p

enter image description here

0 голосов
/ 28 октября 2019

GMB и Kemal,

спасибо,

Я пробовал это

SELECT [Date],
       [Name],
       COUNT(CASE StateData WHEN 'OPENED' THEN 1 END) AS OPENED,
       COUNT(CASE StateData WHEN 'CLOSED' THEN 1 END) AS CLOSED,
       COUNT(CASE WHEN StateData IS NULL THEN 1 END) AS UNUSED
FROM YourTable
GROUP BY [Date],
         [Name];

, но результат неправильный

Name  |  OPENED  |  CLOSED | UNUSED |
Tom   |  2       |   0     |  57412 |
Brad  |  2       |   0     |  57412 |
David |  2       |   0     |  57412 |

правильный результат должен быть таким:

      Date | Name | OPENED | CLOSED | UNUSED |
-----------+------+--------+--------+--------+
22-10-2019 | Tom  |   2    |    1   |    2   |
22-10-2019 | David|   0    |    0   |    1   |
22-10-2019 | Brand|   2    |    2   |    1   |

, но похоже, что это просто копия, вставляющая результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...