【问题标题】:How to count rows to a single column value如何将行数计算为单列值
【发布时间】:2017-12-02 16:09:18
【问题描述】:

我正在尝试获取两行计数并将其分配给单个列。

select distinct 
    userreferenceid, 'Level(' + cast(level as varchar(255))+')' GroupLevel,
    referenceid 
from 
    (select 
         t0.userreferenceid, 
         case level.level
            when 1 then t1.userreferenceid
            when 2 then t2.userreferenceid
            when 3 then t3.userreferenceid 
            when 4 then t4.userreferenceid
         end referenceid,
         level.level
     from 
         member_details t0
     left outer join 
         member_details t1 on t1.referenceid = t0.userreferenceid
     left outer join 
         member_details t2 on t2.referenceid = t1.userreferenceid
     left outer join 
         member_details t3 on t3.referenceid = t2.userreferenceid
     left outer join 
         member_details t4 on t4.referenceid = t3.userreferenceid
     cross join 
         (select 1 level 
          union all
          select 2 
          union all
          select 3 
          union all
          select 4) level) t
where 
    t.referenceid is not null

我的refernceid是用户用来注册的(referalid),userreferenceid是用户自己的id(自己的referenceid)。

对于上述查询,我​​的结果集显示如下

user
ref
ere
nceid   GroupLevel Referenceid
-------------------------------------------
REF101  Level(1)    REF143
REF101  Level(2)    REF113
REF101  Level(3)    REF119
REF101  Level(3)    REF227
REF101  Level(4)    REF245
REF101  Level(4)    REF251
REF107  Level(1)    REF221
REF107  Level(1)    REF257
REF107  Level(2)    REF119
REF107  Level(2)    REF227
REF107  Level(3)    REF125
REF107  Level(3)    REF161
REF107  Level(4)    REF191
REF113  Level(3)    REF191
REF119  Level(1)    REF125

我需要完全像这样的结果集。

我需要分配第 1 、2、3、4 级所有用户的每个 refid 和计数,

Userreferenceid  | Level1users|Level2Users|level3Users|Level4Users
-----------------+------------+-----------+-----------+------------
REF101                1            1           2           2
REF107                2            2           2           1
REF113                0            0           1           0
REF119                1            0           0           0

我的表结构是

userreferenceid (varchar)   ||    referenceid(varchar)

请帮我解决这个问题。在此先感谢

【问题讨论】:

    标签: sql sql-server sql-server-2012


    【解决方案1】:

    试试这个 总和

    select Userreferenceid,
    sum(case when GroupLevel='Level(1)' then 1 else 0 end) Level1users,
    sum(case when GroupLevel='Level(2)' then 1 else 0 end) Level2users,
    sum(case when GroupLevel='Level(3)' then 1 else 0 end) Level3users,
    sum(case when GroupLevel='Level(4)' then 1 else 0 end) Level4users
    from mytable group by Userreferenceid
    

    【讨论】:

    • 当我的表结构本身就像我在第二个块中的结果集时,你的答案是正确的。但是当我执行查询时我得到了那个级别
    【解决方案2】:

    您也可以通过执行动态 sql 查询来做到这一点。如果有很多 GroupLevel 值,那么编写查询会很忙。

    查询

    declare @sql as varchar(max);
    
    select @sql = stuff((
            select distinct 
            ', sum(case when [GroupLevel] = ' + char(39) + [GroupLevel] + char(39) 
            + ' then 1 else 0 end) as [' + replace(replace([GroupLevel], '(', ''), 
    ')', '') + 'Users]'
            from [your_table_name]
            for xml path('')
        )
        , 1, 2, ''
    );
    
    select @sql = 'select [userreferenceid], ' + @sql 
                    + 'from [your_table_name] '
                    + 'group by [userreferenceid];';
    
    exec(@sql);
    

    【讨论】:

    • GroupLevel 不是我的列名。仅在执行我上面提到的相同查询时才获取结果集
    猜你喜欢
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 2019-11-07
    • 1970-01-01
    • 1970-01-01
    • 2015-03-01
    • 2013-12-16
    • 2020-07-28
    相关资源
    最近更新 更多