【问题标题】:Need count of rows for each value type需要每种值类型的行数
【发布时间】:2016-10-03 12:09:03
【问题描述】:

我有一个格式的表格

SID LinkName           
A1  Link1           
A1  Link2           
A2  Link1           
A2  Link2          
A2  Link3         
A3  Link2
A1  Link1
A2  Link2

我需要以以下格式显示每种链接类型的计数结果

Link1   Link2   Link3                   
 3        4        1

请指教。

编辑: 另外,如果我需要以以下格式显示每种链接类型的不同计数的结果。 Like A1 -> Link1 出现两次但只需要计算一次

Link1   Link2   Link3                   
 2        3        1

【问题讨论】:

  • 如果link4突然出现在表格中,预期的结果是什么?
  • 为什么需要这种格式?如果添加 Link4 和 Link5 会发生什么?它不是动态的,只需做一个简单的选择计数并处理显示 LinkName,total。我不明白投票,没有提供代码,你没有尝试任何东西,肯定是重复的问题......
  • 大部分是静态数据需要的。

标签: mysql sql group-by case where


【解决方案1】:

在 MySQL 中,你可以这样做:

select sum(linkname = 'link1') as link1,
       sum(linkname = 'link2') as link2,
       sum(linkname = 'link3') as link3
from t;

编辑:

如果你想计算不同的sid

select count(distinct case when linkname = 'link1' then sid end) as link1,
       count(distinct case when linkname = 'link2' then sid end) as link2,
       count(distinct case when linkname = 'link3' then sid end) as link3
from t;

【讨论】:

    【解决方案2】:
    select sum(case when LinkName = 'Link1' then 1 end) as link1,
           sum(case when LinkName = 'Link2' then 1 end) as link2,
           sum(case when LinkName = 'Link3' then 1 end) as link3
    from tablename
    

    【讨论】:

    • 谢谢。有效。除此之外,如果有冗余数据(表中的冗余或相同行)我如何获得每个链接的唯一计数?
    • 更新您的问题,包括示例表数据和预期结果。
    • 已添加。每个链接都需要唯一计数。请给个建议。我同意动态结果。 BJ Black 给出的查询也是一个不错的选择。
    【解决方案3】:

    通常你不会把它们放在列中,而是放在行中:

    select LinkName, count(LinkName) as LinkCount
    from table group by LinkName
    

    ...这将给出:

    LinkName | LinkCount
    Link1    | 2
    Link2    | 3
    Link3    | 1
    

    这样,如果出现新的链接类型,没什么大不了的。那会起作用吗,还是必须在列中?如果是这样,您可能会查看单个计数(*)和两个子选择或相当复杂的自联接或某些案例方法。喜欢:

    select count(*) as Link1, (select count(*) from table where LinkName='Link2') as Link2...
    from table where LinkName='Link1'
    

    ...或类似的东西。

    【讨论】:

    • 在第一个 SQL 查询中,如果我有两次或更多相同的行(即冗余数据),我如何显示链接名的唯一行数
    • 我的假设是您只关心 LinkName 并假设您只是在计算行数。如果您不是并且需要计算完全唯一的行(查看所有列以找出唯一性),那么您可以选择伪表(select * from table group by col1, col2, ...colN),您将所有分组依据中的列。凌乱,但应该可以工作(尽管它确实提出了为什么表中有重复行的问题)。几乎可以肯定还有其他答案(比如一些复合 DISTINCT 事物或一些非标准 SQL)......
    • 表格有重复的行,因为每次有人单击链接时,都会创建一条新记录。所以假设人们多次点击多个链接,我想知道不。每个链接被唯一点击的次数。希望这可以清除要求。
    • 如果您不在乎获得多少重复点击,我建议在表格上设置唯一性约束并让插入在重复时失败(因此它们从不计算)。否则,我想您的桌子要么变得超大,要么需要定期维护以不时清理它。对此还有其他(更深奥的)修复,但任何喜欢规范化数据的 DBA 都会对数据集中的大量冗余感到不满。不管怎样,祝你好运!
    【解决方案4】:
    select Link1,Link2,Link3
    from 
    (
     select Id,Rtrim(Ltrim(Name)) as Name
     from Table_1
    ) src
    pivot
    (
      count(Id)
    for Name in (Link1,Link2,Link3)
    ) piv;
    

    给出如下:

    Link1   Link2   Link3
    4        3      1
    

    【讨论】:

    • @PankajGupta 使用 pivot 可以在列中获得结果
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-17
    • 2016-08-10
    • 2021-03-15
    • 1970-01-01
    相关资源
    最近更新 更多