2016-06-14 1 views
2

いいえ、3つの表があるとします: カレンダー、ユーザーおよびリクエスト。列の値に基づいてGROUP BYを使用すると、一意の行が返されます

Calendar.ID、Users.IDおよびrequests.IDはすべて一意です。私はdbo.Calendarプラスusers.colorとrequests.Statusからすべてを引くしようとしている

(それは問題にした場合)

SELECT calendar.ID, calendar.date, calendar.type, calendar.userID, users.color, requests.status 
FROM calendar LEFT OUTER JOIN 
    requests ON calendar.ID = requests.calendarID LEFT OUTER JOIN 
     users ON calendar.userID = users.userID 
WHERE(calendar.date >= '2016-06-01') AND (calendar.date <= '2016-12-30') 
group by calendar.id, calendar.date, calendar.type, calendar.userID, users.color, requests.status 

私が取得完了した要求があるかどう私が直面してる問題があります行が重複していますが、この場合は「保留」と表示されます。

ID date  type userID color  status 
4 2016-06-16 RE  A  #cc99ff  pending 
5 2016-06-17 RE  A  #cc99ff  accepted 
5 2016-06-17 RE  A  #cc99ff  pending 
6 2016-06-13 LM  B  #ffff99  NULL 
7 2016-06-13 LM  B  #ffff99  accepted 

私はこの取得しようとしている:

ID date  type userID color  status 
4 2016-06-16 RE  A  #cc99ff  pending 
5 2016-06-17 RE  A  #cc99ff  pending 
6 2016-06-13 LM  B  #ffff99  NULL 
7 2016-06-13 LM  B  #ffff99  accepted 

FYI私は8年以上の中でSQLに触れていない、これは私が働いているだけの個人的なプロジェクトです。

+0

使用ファレ状況を<>「受け入れ」 –

+0

申し訳ありませんが、私はまだ他のレコードを必要とします「受け入れられた」値を持つ。 – Mark

+0

あなたはステータス列を表示しているので、group byを使用している間に 'accepted'を省略することはできません。なぜなら、論理的には、同じIDのdateカラムやetcカラムに対して 'pending'と 'accepted' –

答えて

1

を追加 てグループを必要としない集約functioを使用していませんidと、ユーザーごとに1つの行をしたいが、優先順位付けする:

SELECT * 
FROM (SELECT c.ID, c.date, c.type, u.userID, u.color, r.status, 
      ROW_NUMBER() OVER (PARTITION BY c.ID, u.userID 
           ORDER BY (CASE WHEN r.status = 'Accepted' then 1 
               ELSE 2 
              END) desc 
           ) as seqnum 
     FROM calendar c LEFT OUTER JOIN 
      requests r 
      ON c.ID = r.calendarID LEFT OUTER JOIN 
      users u 
      ON c.userID = u.userID 
     WHERE (c.date >= '2016-06-01') AND (c.date <= '2016-12-30') 
    ) rcu 
WHERE seqnum = 1; 
+0

これは唯一のことはrownum seqnumする必要がありました。あなたは神様です。 – Mark

0

あなたは明確な行が最終的STATUのためのあなたの選択
にdisctinct使いたいならば、あなたはあなたが思われる条件status != 'accepted'

SELECT calendar.ID, calendar.date, calendar.type, calendar.userID, users.color, requests.status 
    FROM calendar LEFT OUTER JOIN 
     requests ON calendar.ID = requests.calendarID LEFT OUTER JOIN 
      users ON calendar.userID = users.userID 
    WHERE(calendar.date >= '2016-06-01') AND (calendar.date <= '2016-12-30') 
    AND requests.status != 'accepted' ; 
関連する問題