2016-12-07 10 views
0

私は、MySQLに関するバックグラウンドを持っておらず、この特定のクエリを書くための適切な足踏みを見つけることができませんでした。条件付きケースに基づいて単一の値を返します。

目的:

私は、ページあたりのアートワークの承認状況を示すレポートを作成しました。ただし、各ページにマークアップ/ノートがあるかどうかを判断するには、アーティストに証明書にアクセスする必要があります。私は、1つの列をレポートに追加して、各プルーフについて1ページあたり3つの文字列値の1つを追加します。

各証拠は複数のページを持つことができます。各ページは複数のマークを持つことができます(何かの周りに円を描くと思います)。各マークは複数のマークを持つことができます。複数のノートを持つことができます。これは私がRBARクエリを回避する必要性を認識しています。私にとっては、物事がかすんで取得する場所、ですが、私はページによって、複数のコメントやマークに対してクエリする方法がわからないと思います。



条件:

これは私がノート/コメントを処理するために持っているRBARクエリです。それぞれのコメントを扱うことはできますが、明らかにレポート上には各コメント行を見る理由はありません。

SELECT *, 
    CASE WHEN note IS NULL OR ' ' AND deleted = FALSE 
    THEN 'Missed' ELSE 'Yes' 
    END AS 'Comment' 
FROM rvm_comment 

マークは、複数のコメントを持つことができることを知って、私はrvm_comment.note内の任意の行が「」、NOT NULLであるか、単にスペースが含まれているかどうかを判断する必要があります。そうであれば、マークは「はい」と表示されます。それ以外の場合は、マークは「Missed」となります。

これは、各マークが比較されるように凝縮/入れ子にされます。 ページのマークが「はい」の場合、その行の出力は「はい」になります。そうでなければ、 "Missed"。

これが意味をなさない場合は、次の情報を参考にしてください。



テーブルと関係: Tables and Joins

DSE_OBJECT表:

このテーブルはプルーフが結合することができ、要求に関連付けられています。 IDはPKです。

RVM_REVIEW_OBJECT表:

この表は、本質的に証明インスタンス自体です。証明は任意のページ数(最小1)を持つことができます。 IDはPK、review_objectはFKです。

RVM_MARK表は:

このテーブルには、彼らが存在するページを含む、証明に追加されたマークに関する情報が含まれています。 IDはPK、review_objectはFKです。 (NOT LISTED)削除は、ユーザーがマークを削除した場合の結果を返さないようにするために使用されます。 rvm_mark.deleted = FALSE

RVM_COMMENT表:

この表は、音符(文字列)が格納される場所です。 Deletedは、ユーザーがメモを削除したときの結果を返さないようにするために使用されます(rvm_comment。削除=偽)。コメントを作成できるシステムに欠陥がありますが、入力後にキーボードで「enter」しないと、テキストはDBに保存されません。このため、rvm_comment.noteでNULLをテストする必要があります。



生試験のためのデータとまとめ:私はそれを試してみます誰のためのCSV形式のいくつかの生のデータが含まれている礼儀としてDropbox with CSVs for the tables

。 (上記のDropboxのリンクをクリックしてください)。

だから、再度要約する。私は、それぞれのrvm_mark.page_noについて、これらのテーブルを単一の文字列(ASコメント)に凝縮するクエリを作成しようとしています。この文字列は、a)rvm_comment.noteがNULLか ''であるかどうか、b)rvm_mark.page_noに一致するrvm_mark.idにNULLでないrvm_comment.noteがあるかどうかに基づいています。


EDITのUPDATE 12/14/16:Barmarに

おかげで、私は最終的な結果に向けた一歩を踏み出すことができました。私は現在、コメントがない状況では文字列 'No'を返そうとしています。これは、rvm_review_object.idにrvm_mark.review_objectに一致する値がない場合にのみ有効になります。

SELECT rvm_review_object.dse_object_id, rvm_review_object.id, 
T_Mark.creator, T_Mark.review_object, 
    CASE WHEN T_Mark.review_object IS NULL THEN 'No' 
    ELSE T_Mark.Comment 
    END AS Comment 
FROM rvm_review_object 

LEFT JOIN(
SELECT rvm_mark.review_object, rvm_mark.creator, rvm_mark.id, 
    CASE WHEN MAX(T_Comment.Comment = 'Yes') = 1 THEN 'Yes' 
    ELSE 'Missed' 
    END AS Comment 
FROM rvm_mark 

LEFT JOIN(
    SELECT rvm_comment.mark, 
     CASE WHEN MAX((rvm_comment.note IS NULL OR rvm_comment.note = '') 
     AND rvm_comment.deleted = FALSE) = 1 
     THEN 'Missed' 
     ELSE 'Yes' 
     END AS Comment 
    FROM rvm_comment 
    GROUP BY rvm_comment.mark) AS T_Comment 

ON T_Comment.mark = rvm_mark.id 
WHERE rvm_mark.deleted = FALSE 
GROUP BY rvm_mark.review_object) AS T_Mark 

ON T_Mark.review_object = rvm_review_object.id 
WHERE rvm_review_object.creator != T_Mark.creator 

答えて

0

markでクエリをグループ化する必要があります。 MAX()を使用して、グループ内のいずれかの行が条件と一致するかどうかを判断できます。

SELECT mark, 
    CASE WHEN MAX((note IS NULL OR note = '') AND deleted = FALSE) = 1 
      THEN 'Missed' 
     ELSE 'Yes' 
    END AS Comment 
FROM rvm_comment 
GROUP BY mark 
+0

ありがとうBarmar。私はこれをできるだけ早く試してみましょう。私は援助に感謝します! – DCanimate

+0

もう一度ありがとうございます。私は上記を1つのページ(rvm_mark.page_no)に1つのマークしか持たない次のステップに移行しようとしました。 EDITが下部に含まれていて、最後の行であるGROUP BYの構文エラーが発生しています。 – DCanimate

+0

'WHERE'節で' MAX() 'のような集約関数を使うことはできません。また、 'MAX()'の引数は複数の列を返すサブクエリにはなりません。 – Barmar

関連する問題