2009-12-29 1 views
3

궁금한데,이 결과 집합은 SQL 쿼리로 얻을 수 있습니까? 여기SQL 열의 집계 값 선택

테이블 여기

item_id name  availability 
----------------------------------- 
1   brush  available 
2   brush  available 
3   paint  not available 
4   paint  available 

어떤 쿼리가 같은 결과

name   available not available 
--------------------------------------- 
brush  2   0 
paint  1   1 

볼 수 있었다이다?

+1

예를 들어 ENUM ('0', '1') '또는 일부'bool '유형의'available/not available '열보다 작은 데이터를 사용하는 것이 좋습니다. – hsz

답변

9
SELECT name, 
     COALESCE(SUM(CASE WHEN availability = 'available' THEN 1 ELSE 0 END), 0) AS available, 
     COALESCE(SUM(CASE WHEN availability = 'available' THEN 0 ELSE 1 END), 0) AS not_available 
FROM mytable 
GROUP BY 
     name 
+0

+1. 두 번째 사례는 '사용할 수 없음'이어야하며 선택 항목에서 이름 열을 잊어 버렸습니다. –

+0

'@Mark Byers' :''available ''이 아닌 모든 것을 매치시켜 SUM이 항상 합계에 합산되도록합니다. – Quassnoi

+0

+1하지만 '사용 가능'의 입력 오류가 수정 될 수 있습니다. –

1

결과를 어떻게 사용할지 알지 못하면 더 간단하고 유사한 쿼리를 사용할 수 있는지 고려해 볼 가치가 있습니다. 예를 들어 :

SELECT name, availability, COUNT(*) As CountOfAvailability 
GROUP BY name, availability 

을 생성합니다 이것은 당신에게 당신의 구현에서와 마찬가지로 사용할 수 있습니다 가까운 결과의 좋은 세트를 제공

name   availability  CountOfAvailability 
--------------------------------------------------- 
brush  available   2 
paint  available   1 
paint  not available  1 

(?). 온 따라

SELECT DISTINCT 
    names.name, 
    available_results.CountOfAvailability As "available", 
    not_available_results.CountOfAvailability As "not available" 
FROM 
vw_Base 
    LEFT JOIN (SELECT CountOfAvailability FROM vw_Base WHERE availability = 'available') As available_results ON vw_Base.name = available_results.name 
    LEFT JOIN (SELECT CountOfAvailability FROM vw_Base WHERE availability = 'not available') As not_available_results ON vw_Base.name = not_available_results.name 

그리고 :

그렇지 않으면, 당신은 또한 다음과 같이 (: 완전히 테스트되지 않은 메모를) 뭔가를 (. vw_Base를 호출 예) 기본보기로 설정 해당 쿼리/결과를 사용할 수 있습니다 사용중인 데이터베이스 시스템에서 함수를 사용하여 반환 된 모든 null 결과를 0으로 변환하십시오 (예 : SQL Server의 ISNULL()).