2010-04-14 3 views
1

테이블의 다른 필드에서 1에서 100까지의 빈도를 계산하려고합니다.T-SQL의 항목 빈도 계산 문제가 발생했습니다.

의 나는 다음과 같은 데이터 테이블 "결과"가 있다고 가정 해 봅시다 :

LottoId Winner Second Third                                                                
--------- --------- --------- --------- 
1   1   2   3                                                                 
2   1   2   3 

나는 숫자에 따라 주파수를 얻을 수 있도록하고 싶습니다. 이를 위해 다음 코드를 사용하고 있습니다 :

--Creating numbers temp table 
CREATE TABLE #Numbers(
Number int) 

--Inserting the numbers into the temp table 
declare @counter int 
set @counter = 0 
while @counter < 100 
begin 
    set @counter = @counter + 1 
    INSERT INTO #Numbers(Number) VALUES(@counter) 
end 

-- 
SELECT #Numbers.Number, Count(Results.Winner) as Winner,Count(Results.Second) as Second, Count(Results.Third) as Third FROM #Numbers 
LEFT JOIN Results ON 
#Numbers.Number = Results.Winner OR #Numbers.Number = Results.Second OR #Numbers.Number = Results.Third 
GROUP BY #Numbers.Number 

문제는 카운트 각 번호에 대해 동일한 값을 반복하는 것입니다. 나는이를 받아야하는 경우

Number Winner Second Third                                                                
--------- --------- --------- --------- 
1   2   2   2                                                                 
2   2   2   2 
3   2   2   2 
... 

:

Number Winner Second Third                                                                
--------- --------- --------- --------- 
1   2   0   0                                                                 
2   0   2   0 
3   0   0   2 
... 

내가 무엇을 놓치고이 특별한 경우에는 내가 다음과 같은 결과를 받고 있어요?

+0

어떤 버전의 SQL Server/Sybase입니까? – Thomas

+0

Microsoft SQL Server 2008 –

답변

0

당신은 SQL 서버를 SQL 서버의 이전 버전에서 작동합니다 2005 +

With 
    WinnerCounts As 
    (
     Select #Numbers.Number, Count(Results.Winner) As Results 
     FROM #Numbers 
      JOIN Results 
       On #Numbers.Number = Results.Winner 
    ) 
    , SecondCounts As 
    (
     Select #Numbers.Number, Count(Results.Second) As Results 
     FROM #Numbers 
      JOIN Results 
       On #Numbers.Number = Results.Second 
    ) 
    , ThirdCounts As 
    (
     Select #Numbers.Number, Count(Results.Third) As Results 
     FROM #Numbers 
      JOIN Results 
       On #Numbers.Number = Results.Third 
    ) 
Select Numbers.Number, Coalesce(WinnerCounts.Results,0) As Winner, Coalesce(SecondCounts.Result,0) As Second, Coalesce(ThirdCounts.Result,0) As Third 
From #Numbers 
    Left Join WinnerCounts 
     On WinnerCounts.Results = #Numbers.Number 
    Left Join SecondCounts 
     On SecondCounts.Results = #Numbers.Number 
    Left Join ThirdCounts 
     On ThirdCounts.Results = #Numbers.Number 

또 다른 가능한 솔루션을 사용하는 경우

Select #Numbers.Number 
    , SUM(Case When Winners.Winner Is Not Null Then 1 Else 0 End) As WinnerCount 
    , SUM(Case When Seconds.Second Is Not Null Then 1 Else 0 End) As SecondCount 
    , SUM(Case When Thirds.Third Is Not Null Then 1 Else 0 End) As ThirdCount 
From #Numbers 
    Left Join Results As Winners 
     On Winners.Winner = #Numbers.Number 
    Left Join Results As Seconds 
     On Seconds.Second = #Numbers.Number 
    Left Join Results As Thirds 
     On Thirds.Third = #Numbers.Number 
Group By #Numbers.Number 
+0

테스트 할 때 구문 분석 오류가 발생합니다. 어딘가에 세미콜론이 누락되지 않았습니까? –

+0

@ Raúl Roa - 조인에 사용한 필드 이름에 오타가 있습니다. 내 게시물을 수정하여 업데이트했습니다. – Thomas

+0

@ Raúl Roa -이 문장 이전에 문장이 있다면 세미콜론으로 끝내야합니다 (또는'With' 문 앞에 세미콜론을 붙이면됩니다). – Thomas

0

당신은 PIVOT 및 UNPIVOT을 사용할 수 있습니다.

SELECT Number, Winner, Second, Third 
FROM (SELECT LottoID, Ranking, Number 
     FROM Lotto UNPIVOT (Number FOR Ranking 
     IN ([Winner], [Second], [Third])) AS unpvt) flat 
    PIVOT (COUNT(LottoId) FOR Ranking 
    IN ([Winner], [Second], [Third])) crosstab