[英]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.