2011-11-11 5 views
3

필자는 친숙한 SQL 공지 사항을 알고 싶어하지만 쿼리 작성에 도움이 필요합니다. 누군가가 올바른 방향으로 나를 조종 할 수 있다면, 나는 감사 할 것입니다.이 SQL 쿼리는 어떻게 작성합니까?

테이블은 TeamRankings입니다. 열은 다음과 같습니다

score | qualities_id | team_id | year | source 

특정 년 동안 서로 다른 자질에 대한 채점됩니다. 주어진 팀은 여러 점수를 할당받을 수 있습니다 (각각은 다른 출처에서 나옵니다). 마찬가지로 주어진 팀은 주어진 해 동안 어떤 점수도 얻지 못할 수도 있습니다.

가 여기에 문제의 : 하나의 품질을 감안할 때

, 그리고 팀의 목록, 나는 그 팀의 각 적어도 하나 개의 점수를 갖고있는 년의 목록을 찾고 싶어요.

저는 Rails (3.1)에서이 기능을 사용하고 있습니다. Active Record와 여러 db 호출을 사용하여이 작업을 수행 할 수있었습니다. 그러나 나는 순수한 SQL로 할 수 있기를 바란다. Active Record의 보너스 포인트는 1 db 콜을 제한합니다. 많은

답변

1

감사합니다 다음은 6 개 팀이하려는 경우에 대한 예입니다. HAVING 절에서 테스트 한 값 (예제에서는 6)은 IN 절에 포함 된 team_ids 수와 일치해야합니다.

SELECT year 
    FROM TeamRankings 
    WHERE qualities_id = 1 
     AND team_id IN (4,8,15,16,23,42) 
    GROUP BY year 
    HAVING COUNT(DISTINCT team_id) = 6; 
+0

BAM! 감사합니다! – doublea

1

Ruby를 통해 매개 변수를 전달하는 방법은 확실하지 않지만 일부 SQL이 있습니다. 팀 이름을 얻으려면 팀 테이블에 가입하고 싶을 수 있습니다. 아니 스키마에 포함,하지만 ...

Select Distinct tr.Team_id, t.TeamName, tr.Year 
From TeamRankings tr 
    Inner Join Teams t 
Where Exists (
    Select 1 From TeamRankings 
    Where Team_id=tr.TeamID and Year=tr.Year and [email protected] 
) 
1

가 SQL을 사용하는 경우에만, 당신은 ... 데이터가 모든 팀이 존재하는지 확인 HAVING 절을 사용하여 다음 YAR, 그리고 그룹에 필요

SELECT 
    year 
FROM 
    TeamRankings 
WHERE 
    team_id IN (<your_list>) 
    AND qualities_id = <your quality id> 
GROUP BY 
    year 
HAVING 
    COUNT(DISTINCT team_id) = <your number of teams> 


흥미로운 점은 목록을 SQL 쿼리로 전달하는 방법입니다. 내 평소 습관은 쉼표로 구분 된 id '문자열을 전달한 다음 sql 함수를 사용하여 해당 문자열을 레코드 집합으로 나눕니다. 그것은 확실히 우아함을 느끼지 못하지만, 나는 더 많은, 음, 새로운 솔루션을 만났습니다 ...

SELECT 
    year 
FROM 
    TeamRankings 
INNER JOIN 
    dbo.my_split_function(@list_of_ids) AS Team 
    ON Team.id = TeamRankings.team_id 
WHERE 
    qualities_id = @quality_id 
GROUP BY 
    year 
HAVING 
    COUNT(DISTINCT team_id) = (SELECT COUNT(DISTINCT id) FROM dbo.my_split_function(@list_of_ids)) 
관련 문제