0

結果セットを取得するために使用する2つのテーブルがあります

select 
a.id,
a.test,
a.score,
b.name,
b.person,
b.grade
from table_test a, table_pers b 
where a.test=b.test 

問題は、テーブルbに複数のエントリがあり、それらはすべて同じですが、「合格」の場合です...合格が1人に「はい」で「いいえ」の場合、「はい」の結果行のみが必要で、それ以外の場合は「いいえ」の行が必要です複数ある場合はそのうちの1つだけです。

それがどのように機能するかについて何か考えはありますか?

前もって感謝します。

ケースはグループが好きではないので、ここで選択に関するより詳細なビューがあります:

select
t.id,
t.tests test,
t.lang,
m.title_TEXT Titel, 
m.Sched Schedual,
m.prof profs, 
m.date_out Date,
m.sub subject,
m.chan Changes, 
case
when m.cha2 = ''
then m.cha1
else m.cha2
end as last_change,
case
when m.datac2 = ''
then m.datac1
else m.datac2
end as Change_date,         
t.posp,
t.A1,
t.B1,
t.Failed,
t.analy,         
t.vect,
t.cover,
t.typ,
t.circ,
t.deadline
from table_test t, table_pers m where m.test=t.test

t.passed で確認する値は '1A' と '1B' です。1A がある場合は、その行が必要です。1B しかない場合は、それらの行の 1 つが必要です。

完全な選択には39個のフィールドがあります..しかし、欠落しているものは通常の選択であり、ケースやそのようなものはありません。

4

2 に答える 2

1

という事実を'Yes' > 'No'利用できるので、次を使用できます。

select  a.id,
        a.test,
        a.score,
        b.name,
        b.person,
        b.grade,
        MAX(Passed) AS Passed
from    table_test a
        INNER JOIN table_pers b 
            ON a.test = b.test
GROUP BY a.id, a.test, a.score, b.name, b.person, b.grade;

注意: ANSI 89 JOIN を新しい ANSI 92 JOIN 構文に切り替えました。この記事では、そうする正当な理由をいくつか取り上げますが、それは主観的なものであり、最終的にはあなたが選択するものであり、どちらの方法でも結果は同じです.

代替の、おそらくより多くの解決策 ( に他の異なる許容値がある場合passed) は次のようになります。

select  a.id,
        a.test,
        a.score,
        b.name,
        b.person,
        b.grade,
        CASE WHEN COUNT(CASE WHEN Passed = 'Yes' THEN 1 END) > 0 THEN 'Yes' ELSE 'No' END AS Passed
from    table_test a
        INNER JOIN table_pers b 
            ON a.test = b.test
GROUP BY a.id, a.test, a.score, b.name, b.person, b.grade;

編集

CASE が group by で機能しないことを知っている理由はありません (完全な case ステートメントではなく group by でエイリアスを使用している場合を除きます)。ただし、次のROW_NUMBER()関数を使用してこれを実現することもできます。

SELECT  *
FROM    (   SELECT  t.id,
                    t.tests test,
                    t.lang,
                    m.title_TEXT Titel, 
                    m.Sched Schedual,
                    m.prof profs, 
                    m.date_out Date,
                    m.sub subject,
                    m.chan Changes, 
                    case when m.cha2 = '' then m.cha1 else m.cha2 end as last_change,
                    case when m.datac2 = ''then m.datac1 else m.datac2 end as aenderungsdatumChange_date,      
                    t.posp,
                    t.A1,
                    t.B1,
                    t.Failed,
                    t.analy,         
                    t.vect,
                    t.cover,
                    t.typ,
                    t.circ,
                    t.deadline,
                    ROW_NUMBER() OVER(PARTITION BY t.ID ORDER BY t.Passed) AS rn
            from    table_test t
                    INNER JOIN table_pers m 
                        ON m.test = t.test
        ) t
WHERE   rn = 1
于 2013-06-18T07:40:39.767 に答える
1
select  a.id,
        a.test,
        a.score,
        b.name,
        b.person,
        b.grade,
        Passed
from    table_test a
        INNER JOIN table_pers b 
            ON a.test = b.test
    where qualify row_number() over (partition by a.id order by passed desc)=1;
于 2013-06-18T08:35:29.100 に答える