2009-11-18 4 views
2

내가 찾고있는 것은 같은 테이블의 여러 데이터를 그룹화하고 합계를 계산하여 서로 다른 두 열로 표시하는 것입니다. 아래처럼. 테이블에열의 값 계산

데이터

필드 : 쿼리

Name Type 
Bob 1 
John 2 
Bob 1 
Steve 1 
John 1 
Bob 2 

원하는 결과 :

Name Type 1 Type 2 
Bob 2  1 
John 1  1 
Steve 1  0 
+1

이궁, 나는 그가 RDMS에 따라 달라집니다 것 같아요; ANSI SQL로 수행 할 수 있는지 확실하지 않습니다. 어떤 DB입니까? –

답변

7

이 SQL Server의 트릭을 할 것입니다 : 크로스 탭 솔루션을 찾고있는

SELECT 
    name, 
    SUM(CASE type WHEN 1 THEN 1 ELSE 0 END) AS type1, 
    SUM(CASE type WHEN 2 THEN 1 ELSE 0 END) AS type2 
FROM 
    myTable 
GROUP BY 
    name 
+0

내가 쓰는 바로는 거의 정확하게. – ale

+0

SQL Server에서 CASE ... END 문을 사용하면 IF() 구문이 없습니다. –

+0

감사합니다. Philip, Adam이 RDBMS를 지정하기 전에 작성했습니다. – Seb

0

@Seb이 좋은 해결책이 있지만 서버에 의존합니다. 다음은 대체 가능해야하는 보조 선택을 사용하는 것입니다.

select 
    name, 
    (select count(type) from myTable where type=1 and name=a.name) as type1, 
    (select count(type) from myTable where type=2 and name=a.name) as type2 
from 
    myTable as a 
group by 
    name 
0

두 개의 별도 GROUP BY 하위 쿼리를 사용하십시오.

SELECT Name, a.Count1, b.Count2 
from myTable 
JOIN 
    (SELECT Name, SUM(Type) AS Count1 FROM myTable GROUP BY Name WHERE Type=1) AS a ON a.Name = myTable.Name 
    (SELECT Name, SUM(Type) FROM myTable GROUP BY Name WHERE Type=2) AS b ON b.Name = myTable.Name 
2

코드를 작성할 시간이 없지만 여기서는 원하는 Case 문을 사용할 수 있습니다. 케이스를 만나는 경우에는 1을, 그렇지 않으면 0으로 만듭니다. 그런 다음 열을 합할 수 있습니다.

0

. 위의 솔루션은 효과가 있지만 일반 솔루션을 원하고 N 유형을 사용하면 문제가 없습니다.

크로스 탭 솔루션으로 해결할 수 있습니다. 일부 숫자를 빠르게 처리하려면 Excel로 데이터를 덤프하고 기본 피벗 테이블 기능을 사용하십시오.

앱의 RDBMS 인 경우 RDBMS에 따라 다릅니다. MS SQL 2005 이상에는 크로스 탭 구문이 있습니다. 참조 :

http://www.databasejournal.com/features/mssql/article.php/3521101/Cross-Tab-reports-in-SQL-Server-2005.htm