2013-12-18 2 views
0

많은 Max/Count Q가 응답하는 것을 보았지만이 문제를 해결할 수는 없습니다. 두 테이블, 첫 번째 사람과 두 번째 result_sets가 있다고 가정 해 보겠습니다. 여기에는 다음과 같은 데이터가 포함됩니다.다른 SQL Max/Count Qestion

사람들 테이블, ID 및 성별 플래그 (다른 것들 중에서);

p_id p_gen 
1  1 
2  1 
3  0 
4  1 
5  0 
5  1 

RESULT_SET 테이블은 내가 영어로 수행하고 싶습니다 무엇

r_id p_id a_id s_id t_id 
1  1  0  5  0 
2  1  1  5  0 
3  1  2  5  0 
4  1  3  5  0 
18  1  0  6  1 
19  1  1  6  1 
20  1  2  5  1 
21  1  3  6  1 
52  4  0  5  0 
53  4  1  5  0 
54  4  2  5  0 
55  4  3  5  0 
69  4  0  5  1 
70  4  1  6  1 
71  4  2  6  1 
72  4  3  5  1 
103  5  0  5  0 
104  5  1  5  0 
111  5  8  6  0 
112  5  9  6  0 
113  5  10  5  0 
120  5  0  6  1 
121  5  1  6  1 
128  5  8  6  1 
129  5  9  6  1 
130  5  10  6  1 
137  5  0  6  2 
138  5  1  6  2 
145  5  8  7  2 
146  5  9  6  2 
147  5  10  7  2 
205  2  0  5  0 
206  2  1  5  0 
207  2  2  5  0 

,이 같은 것입니다;

result_set 테이블의 경우 0 일 때 s_id를 무시합니다. group a_id col (총 17 개의 a_id 값, 0-16)은 각 s_id 값의 개수를 합산하지만 가장 높은 t_id를 가진 행만을 계산합니다. 따라서 두 개 이상의 행이 동일한 a_id & p_id를 갖는 경우 가장 높은 t_id를 가진 행만 계산하십시오. 위의 데이터 세트의 경우, 아래의 4가 동일한 p_id & a_id와 관련되어 있지만 t_id가 더 크므로 처음 4 개의 행은 무시됩니다. 9-12 행은 같은 이유로 계산되지 않으며 17-26 행은 무시됩니다. 즉 27-31 행의 p_id가 더 높습니다. 표시된 마지막 3 개의 행이 계산됩니다.

그래서 (위의 데이터에서) 돌아가고 싶습니다.

a_id s_id Qty 
0  5  2 
0  6  2 
1  5  1 
1  6  3 
2  5  5 
2  6  1 
3  5  1 
3  6  1 
8  7  1 
9  6  1 
10  7  1 

문제가 더 복잡해지기 때문에 필자는 사람 테이블의 p_gen 열을 기준으로 데이터를 필터링하고 싶습니다. 즉 p_gen이 1 인 p_id에 대한 데이터 만 말합니다.

나는 설명하려고 애쓰는 것이 있으면 좋겠다. 분명히 나는 ​​SQL보다 더 많이 SQL을 연구 할 필요가 있지만 며칠 동안 이미 이것을 붓고 (봤다가), 나는 정말로 도움이 될 수있다.

너무 단순하지 않기를 바랍니다.

건배,

나의 사과 나는 다니엘 B (@ 다니엘-B?)에 회신 수 있도록 응답을 편집하는 방법을 정말 잘 모르겠어요으로는, 쿼리 내가 ingnore하려면 0을 포함 S_ID 값을 반환 거기에 있어야 할 다른 s_id 값을 생략했습니다. 아마도 나는 설명 할 좋은 일을하지 않았다. 어쨌든 내 실제 데이터를 사용하여 쿼리가 반환되었습니다.

a_id s_id Qty 
=================== 
0  0  14 
0  6  1 
1  0  14 
1  6  1 
2  0  14 
2  5  1 
3  0  14 
3  6  1 
4  0  14 
4  6  1 
5  0  14 
5  6  1 
6  0  14 
6  6  1 
7  0  14 
7  6  1 
8  0  14 
8  7  1 

등 ...

이 방법 가까이 내가 가진 것보다입니다. 17 명의 모든 a_id 값이 존재하고 각각의 a_id (14 + 1)에 대한 총 s_id 값은 15 명으로 0 일 때 s_id 값이 없어야하고 5의 값이 더 많아야하므로 반드시 맞아야합니다. 나는 실종 된 것을 해결할 수 있는지 알게 될 것이다.

건배,

편집 # 2, 성공!

Daniel B는 많은 도움을 주셨고 많은 도움을 주셨습니다. Daniel B가 제공 한 쿼리 (아마도 제대로 설명하기 힘들 기 때문일 수 있습니다.), 즉 s_id 필터 (WHERE s_id <> 0)를 하위 쿼리로 이동하면 트릭이 완료됩니다. 이 결과는;

SELECT rs.a_id, rs.s_id, COUNT(rs.s_id) Qty 
FROM result_set rs 
INNER JOIN 
(SELECT p_id, a_id, MAX(t_id) t_id FROM result_set WHERE s_id <> 0 GROUP BY p_id, a_id) X 
ON rs.p_id=X.p_id AND rs.a_id=X.a_id AND rs.t_id = X.t_id 
INNER JOIN people p ON p.p_id = rs.p_id 
WHERE p.p_gen = 1 
GROUP BY rs.a_id, rs.s_id 
Order by a_id 

이제 완전히 무슨 일이 일어나는지 이해하기 위해 연구해야합니다.다시 한번 감사 다니엘 B.

+0

DBMS는 SQL Server (2008 R2)입니다. 찾고 Thnks. – user3115420

답변

0

이 시도 :

SELECT rs.a_id, rs.s_id, COUNT(rs.s_id) 
FROM result_set rs 
INNER JOIN 
    (SELECT p_id, a_id, MAX(t_id) t_id FROM result_set GROUP BY p_id, a_id) X 
ON rs.p_id=X.p_id AND rs.a_id=X.a_id AND rs.t_id = X.t_id 
INNER JOIN people p ON p.p_id = rs.p_id 
WHERE p.p_gen = @Gender_Variable 
AND NOT rs.s_id = 0 
GROUP BY rs.a_id, rs.s_id 

내부는 부속 선택하기 위해 가입하는 것은에만있다가 p_id 및 A_ID 당 최고 t_id을 포함한다.

+0

네 말이 맞아. 이 경우에는 내 해결책이 과도했다. – ErikE

+0

이것 좀 봐 주셔서 감사합니다. 쿼리는 s_id 값을 0으로 반환합니다.이 값은 무시하고 다른 s_id 값이 누락되었습니다. 죄송합니다.이 형식을 처음 사용하면 내 글을 수정할 수 있습니다. – user3115420

+0

0 개의 s_id 값을 제거하는 필터를 추가했습니다. 어떤 s_id 값이 누락 되었습니까? –