簡體   English   中英

不分組計數

[英]count without group

我有一張名為 GUYS(ID,NAME,PHONE) 的表,我需要計算有多少人有相同的名字,並同時顯示所有這些人,所以我不能對它們進行分組。 例子:

ID NAME  PHONE
1  John  335   
2  Harry 444
3  James 367
4  John  742
5  John  654

想要的輸出應該是

ID NAME  PHONE COUNT
1  John  335   3
2  Harry 444   1
3  James 367   1
4  John  742   3
5  John  654   3

我怎么能這樣做? 我只能設法得到很多不同數量的人。

謝謝

使用聚合查詢:

select g.ID, g.Name, g.Phone, count(*) over ( partition by g.name ) as Count
from 
Guys g;

8.0+ 的更新:這個答案在 MySQL 版本 8 之前寫得很好,它引入了與 Oracle 中現有的語法幾乎相同的窗口函數

在這種新語法中,解決方案是

SELECT
  t.name,
  t.phone,
  COUNT('x') OVER (PARTITION BY t.name) AS namecounter
FROM
  Guys t

下面的答案仍然適用於較新的版本,在這種特殊情況下同樣簡單,但根據具體情況,這些窗口函數更容易使用。


舊版本:由於 MySQL 直到版本 8,都沒有像 Oracle 這樣的分析功能,您必須求助於子查詢。

不要使用GROUP BY ,使用子選擇來計算同名的人的數量:

SELECT
  t.name,
  t.phone,
  (SELECT COUNT('x') FROM Guys ct 
   WHERE ct.name = t.name) as namecounter
FROM
  Guys t

你會認為為每一行運行一個子選擇會很慢,但是如果你有正確的索引,MySQL 會優化這個查詢,你會發現它運行得很好。

在此示例中,您應該在Guys.name上有一個索引。 如果子查詢的where子句中有多個列,則查詢可能會受益於所有這些列上的單個組合索引。

您仍然可以使用GROUP BY進行計數,只需將其JOIN原始表即可獲取所有記錄,如下所示:

select g.ID, g.Name, g.Phone, gc.Count
from Guys g
inner join (
    select Name, count(*) as Count
    from Guys
    group by Name
) gc on g.Name = gc.Name

在 Oracle DB 中,您可以使用

SELECT ID,NAME,PHONE,(Select COUNT(ID)From GUYS GROUP BY Name) FROM GUYS ;

select id, name, phone,(select count(name) from users u1 where u1.name=u2.name) count from users u2
DECLARE @tbl table 
(ID int,NAME varchar(20), PHONE int)
insert into @tbl
select 
1  ,'John',  335   
union all
select 
2  ,'Harry', 444
union all
select 
3  ,'James', 367
union all
select 
4  ,'John',  742
union all
select 
5  ,'John',  654

SELECT
 ID
 , Name
 , Phone
 , count(*) over(partition by Name)
FROM @tbl 
ORDER BY ID

嘗試

選擇 column1,count(1) over ()

它應該有幫助

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM