programing

그룹없이 세다

goodsources 2023. 9. 18. 21:19
반응형

그룹없이 세다

GUYS(ID, NAME, PONE)라는 이름의 테이블이 하나 있는데, 같은 이름을 가진 남자가 몇 명인지 세어보고 동시에 모두 보여줘야 합니다.그래서 난 그들을 모을 수가 없어요.

예:

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

내가 어떻게 그럴 수 있을까?다른 숫자를 가진 많은 남자들만 겨우 구할 수 있었습니다.

감사해요.

8.0+용 업데이트: 이 답변은 Oracle의 기존 구문과 대부분 동일한 구문을 가진 윈도우 기능을 도입한 MySQL 버전 8보다 훨씬 이전에 작성되었습니다.

이 새로운 구문에서 해결책은

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

아래의 답변은 최신 버전에서도 여전히 작동하며, 이 경우에도 마찬가지로 간단하지만 상황에 따라 이러한 창 기능을 사용하기가 훨씬 쉽습니다.


이전 버전: 버전 8까지는 MySQL에 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하위 쿼리의 조항, 쿼리는 모든 열에 대한 단일 결합 인덱스를 통해 이점을 얻을 수 있습니다.

집계 쿼리 사용:

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

여전히 A를 사용할 수 있습니다.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 ;

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
select id, name, phone,(select count(name) from users u1 where u1.name=u2.name) count from users u2

해라

열 1을 선택하고 () 위에 카운트(1)를 계산합니다.

도움이 될 것입니다

언급URL : https://stackoverflow.com/questions/4259611/count-without-group

반응형