【问题标题】:Increment columns value based on duplicity record根据重复记录增加列值
【发布时间】:2019-10-27 22:09:03
【问题描述】:

我有一个问题,是否可以避免使用光标。

我有一张这样的表,上面有数千条记录:

   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 创建存储过程来完成,但我对光标没有那么经验。

【问题讨论】:

    标签: sql sql-server tsql group-by pivot


    【解决方案1】:

    使用条件聚合:

    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 
    

    【讨论】:

      【解决方案2】:

      你可以使用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
      

      【讨论】:

        【解决方案3】:

        专线小巴和凯末尔,

        谢谢,

        我试过了

        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   |
        

        但它似乎只是复制粘贴结果。

        【讨论】:

        • 您已写入您拥有的数据 23-10-2019 |品牌 |空
        • 这是一个答案吗?还是澄清问题?
        • 这是一个澄清
        猜你喜欢
        • 2018-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-22
        • 2021-11-11
        • 2012-03-27
        相关资源
        最近更新 更多