2016-05-25 3 views
0

C#またはlinqpadでOKのSQLクエリタスクがありますが、標準のレポートツールで実行できるようにSQLで作業することをお勧めします。[My] foreach処理が必要なSQLクエリ構文

エンドDBはMySQLの

下のbugzilla

ある問題は、私はどのように、「有効」親レコードを検討するために、特定の変更を探してbug_activityをループする必要がありますか?例: 私は、Webの実施例は、単に宣言し、ループが、を示してこれを行う方法がわからないよ

if bug_status went to IN BACKLOG 
    then bug_status went to ASSIGNED 
    and this happened 2016-03-01 to 206-03-31 
    then consider valid record 

のような疑似ロジックループ「は、選択から」コードにどのように適合しますか。

set @BugID = 64252; 

select 
    bugs_activity.bug_id, 
-- profiles.realname, 
-- profiles.login_name, 
    bugs_activity.bug_when, 
    fielddefs.name, 
    bugs_activity.added 
-- bugs_activity.removed 
from 
    bugs_activity, 
    profiles, 
    fielddefs 

-- Real world 'Where xx' will have more logic and result in a number of bugzilla records 
-- Each bugzilla record has its own 'bugs_activity' 
-- Logic needs to look at each buzilla records historyto filter results 
-- Want to end up with a filtered record set and a total number of records 
Where bug_id = @BugID AND bugs_activity.who = profiles.userid AND bugs_activity.fieldid = fielddefs.id 

bug_activity

bug_id bug_when name added 
64252 26/01/2016 6:51:30 AM status_whiteboard ID:103138574 
64252 26/01/2016 6:52:10 AM cc [email protected] 
64252 28/01/2016 9:49:10 AM bug_status IN BACKLOG 
64252 28/01/2016 9:49:10 AM cf_escalation_notes Effort: 2 
Reproduced by support 
64252 28/01/2016 9:49:10 AM assigned_to [email protected] 
64252 2/05/2016 4:33:05 PM bug_status ASSIGNED 
+0

を有することをSELECTセクションで、その後

MAX(CASE WHEN bug_status='IN BACKLOG' THEN action_date ELSE NULL END) as backlogDate, MAX(CASE WHEN bug_status='ASSIGNED' THEN action_date ELSE NULL END) as assignedDate 

とを追加

少しだけ?あなたはおそらくループなしでそれを行うことができます。 SQLはベースに設定され、ループは目的を破ります。 – HoneyBadger

答えて

1
SELECT 
    bug_id, 
    SUM(CASE WHEN bug_status='IN BACKLOG' THEN 1 ELSE 0 END) as backlogCount, 
    SUM(CASE WHEN bug_status='ASSIGNED' THEN 1 ELSE 0 END) as assignedCount 
FROM bugs_activity 
WHERE action_date BETWEEN '2016-03-01' AND '206-03-31' 
GROUP BY bug_id 
HAVING backlogCount>0 AND assignedCount>0 

の例期間中に 'バックログ' および 'ASSIGNED' 状態にあった選択返すbug_ids。あなたはbugs_activity

UPDATEするのではなく、あなたのFROM節で上記のクエリを使用することができます:あなたはあなたの要件を説明することができますセクションAND backlogDate<assignedDate

+0

おかげで、これはこれは ' を得る ' bug_id、 SUM SELECT(fielddefs.name = WHEN CASE' をするのに十分な私を与えた –

+0

感謝を取得するために十分な私を与えたTHEN 'bug_statusバックログANDが= bugs_activity.added' 1つのELSE 0 END) backlogCountとして 割り当てられた数としてSUM(fielddefs.name = 'bug_status' AND bugs_activity.added = 'ASSIGNED' THEN 1 ELSE 0 END)を指定します。 FROM bugs_activity、fielddefs WHERE bug_when '2016-03-01' AND '2016 -03-31 ' GROUP BY bug_id backlogCount> 0かつassignedCount> 0'' どのように「WHERE Bug_when」ロジックをSelect-want StateAに移動し、StateBにStateB内部日付を設定しましたか?ありがとう –