2017-05-06 25 views
1

私は2つのクエリの結果が必要なSQLクエリで作業しています。最初のクエリはこれです:2つのクエリを結合する - Postgresql

これは以下になる
select s.code, count(s.code), s.name from course_staff c join courses e on 
c.course = e.id 
join subjects s on e.subject = s.id 
join semesters x on e.semester = x.id 
where c.staff = 5033690 
group by s.code, s.name 
having count(s.code) > 8; 

code | count |    name 
----------+-------+-------------------------------- 
    MATS1464 | 10 | Professional Comm&Presentation 
    MATS6605 |  9 | Prof Comm & Presentation 

2のクエリ:

count 
------- 
    30 

:これは以下になる

select count(distinct s.code) from course_staff c join courses e 
on c.course = e.id 
join subjects s on e.subject = s.id 
join semesters x on e.semester = x.id 
where c.staff = 5033690 
having count(s.code)>20; 

私は両方のカウントを組み合わせる必要があります上記2つのクエリの条件を1つのクエリにまとめて、関数またはビューで使用できるようにします。両方の条件が満たされるようにこれらの2つのクエリをどのように結合することができるかについてアドバイスしてください。ヘルプは非常に感謝しています。おかげ

+0

hh?サンプルデータと希望の結果を表示してください。 –

+0

あなたがここで求めていることはあまり明確ではありません。 1つのクエリにはcount(s.code)> 20のhas節があり、もう1つはcount(s.code)> 8です...これらは同じフィールドなので、どのようにクエリを組み合わせることができるか分かりません。 2番目のクエリに表示する最初のクエリの列が必要ですか?または、他の何か? –

+0

最初のクエリは基本的に、特定のサブジェクトが何年にもわたって教えられた回数であり、2番目のクエリは、何年にもわたって教わった別個のサブジェクトの総数です。 – user

答えて

0

はここ(Postgresのウィンドウの機能を使用して)考えです:

WITH 
    code_name (code, name) AS ( 
    SELECT s.code, s.name 
    FROM course_staff c 
    JOIN courses e ON c.course = e.id 
    JOIN subjects s ON e.subject = s.id 
    JOIN semesters x ON e.semester = x.id 
    WHERE c.staff = 5033690 
), 
    code_name_counts (code, name, count_both, count_total) AS ( 
    SELECT DISTINCT code, 
        name, 
        COUNT(code) OVER (PARTITION BY code, name),          
        COUNT(code) OVER (PARTITION BY code)             
    FROM code_name 
) 
SELECT code, name, count_both, count_total 
FROM code_name_counts 
WHERE count_both > 8 AND count_total > 20 ; 

があなたの要件についての更なる知識がなく暗闇の中でショットを検討してください。

と、(WHEREなし)テスト目的のために

WITH 
    code_name (code, name) AS ( 
    VALUES (1, 'a'), (1, 'b'), (2, 'b'), (2, 'b'), (3, 'c') 
), 
    code_name_distinct (code, name) AS ( 
    SELECT DISTINCT code, name 
    FROM code_name 
), 
    code_name_counts (code, name, count_both, count_total) AS ( 
    SELECT code, 
      name, 
      (SELECT COUNT(*) FROM code_name a 
      WHERE a.code = x.code AND a.name = x.name), 
      (SELECT COUNT(*) FROM code_name b 
      WHERE b.code = x.code) 
    FROM code_name_distinct x 
) 
SELECT code, name, count_both, count_total 
FROM code_name_counts 

返し:

WITH 
    code_name (code, name) AS ( 
    VALUES (1, 'a'), (1, 'b'), (2, 'b'), (2, 'b'), (3, 'c') 
), 
    code_name_counts (code, name, count_both, count_total) AS ( 
    SELECT DISTINCT code, 
      name, 
      COUNT(code) OVER (PARTITION BY code, name), 
      COUNT(code) OVER (PARTITION BY code) 
    FROM code_name 
) 
SELECT code, name, count_both, count_total 
FROM code_name_counts ; 

ここ

code | name | count_both | count_total 
------+------+------------+------------- 
    1 | a |   1 |   2 
    2 | b |   2 |   2 
    1 | b |   1 |   2 
    3 | c |   1 |   1 

を与え、DISTINCTPARTITION BY無し例であります上記と同じ結果です。

関連する問題