【问题标题】:Count of occurrences per row ignoring the duplicates忽略重复项的每行出现次数
【发布时间】:2013-08-19 19:47:05
【问题描述】:

基本上,我想知道 Excel 的 COUNTIF(Range,Criteria) 的 SQL 等效项

我想要这个输出

CALL ID |  Name  | Phone Number | # of Occurrences    
  0001  | Name1  |  0000000000  |        2    
  0002  | Name2  |  1111111111  |        1    
  0003  | Name1  |  0000000000  |        2    
  0004  | Name3  |  2222222222  |        2    
  0005  | Name5  |  4444444444  |        1    
  0006  | Name4  |  3333333333  |        1    
  0007  | Name3  |  2222222222  |        2

不是这个输出

CALL ID |  Name  | Phone Number | # of Occurrences    
  0001  | Name1  |  0000000000  |        2    
  0002  | Name2  |  1111111111  |        1    
  0004  | Name3  |  2222222222  |        2    
  0005  | Name5  |  4444444444  |        1    
  0006  | Name4  |  3333333333  |        1    

这是一个简化的表格。这是我的复杂表,这是结果 Result

我想要的是避免有 2 个约会,而是将它们列在单独的行中,以便约会只有 1 个

这里是查询

SELECT
a."Call ID" as "Call ID",
CONCAT(a.Campaign, '-', a."CONTACT ID") as IDENTIFIER,
REPLACE(a."Campaign",'CW-','') as "Campaign",
a."DNIS" as "DNIS",
a."CONTACT ID" as "CONTACT ID",
a."first_name" as "first_name",
a."last_name" as "last_name",
a."city" as "city",
a."street" as "street",
a."zip" as "zip",
a."state" as "state",
a."number2" as "number2",
a."number1" as "number1",
a."Customer ID - real" as "Customer ID - real",
COUNT(a."Call ID") as "Dial Attempts"
FROM  "Five9 Calls" a 
group by 
CONCAT(a.Campaign, '-', a."CONTACT ID"),
REPLACE(a."Campaign",'CW-',''),
a."CONTACT ID",
a."first_name",
a."last_name",
a."city",
a."street",
a."zip",
a."state",
a."number2",
a."number1"

【问题讨论】:

  • 请提供尝试过的解决方案,为什么它们不起作用,以及预期的结果。
  • 我尝试的解决方案太长,我只是将其简化为这个。让我编辑

标签: sql oracle excel zoho


【解决方案1】:

Declan 的回答为您提供了与每个电话号码关联的姓名数量(每个电话号码一行)。

如果保持相同的行数对您很重要(即您在问题中描述的相同布局),您可以使用OVER 子句。

SELECT NAME, [PHONE NUMBER], COUNT(NAME) OVER (PARTITION BY [PHONE NUMBER]) AS OCCUR
FROM YOURTABLE

有了OVER,就不需要GROUP BY

【讨论】:

  • 不妨试试这个。另一个答案也是正确的,但在某些时候,这不是我想要的输出。因为它仍然按电话号码分组。我实际上有一个很长的查询,但我只是将其简化为这个。
  • 我已经尝试过了,上面的代码(我更新了帖子),并将其替换为: COUNT(a."Call ID") OVER (PARTITION BY CONCAT(a.Campaign, ' -', a."CONTACT ID"),REPLACE(a."Campaign",'CW-',''),a."CONTACT ID",a."first_name",a."last_name",a." city",a."street",a."zip",a."state",a."number2",a."number1") as "Dial Attempts" 删除组,它只返回一行跨度>
  • 是的,真正的代码总是比概念更复杂;)它有用吗?
  • 对不起。我太菜鸟了,这是我第一次在 stackoverflow 上,所以我不知道如何正确发布......它虽然有效,但它返回了一行:(你能看出这有什么问题吗?
  • OVER() 分析函数永远不会删除行。如果缺少某些东西,那一定是因为WHEREJOINGROUP BY
【解决方案2】:

如果您需要计算每个电话号码的出现次数(我可以从您的数据中收集到),您可以使用以下方法。

SELECT [PHONE NUMBER],COUNT(NAME) AS OCCUR
FROM YOURTABLE
GROUP BY [PHONE NUMBER]

【讨论】:

  • 但它只返回不同的值。我希望它返回所有值。这正是我想要的输出。
【解决方案3】:
select call_id, name, phone_number, count() over (partition by name, phone_id order by name asc, phone_id asc) occur
From yourtable

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-12
    • 2016-03-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-27
    • 2019-11-24
    • 2016-03-21
    相关资源
    最近更新 更多