2016-05-25 4 views
0

Ich habe eine SQL-Abfrage-Aufgabe, die ich in C# oder linqpad OK tun kann, aber es wäre in SQL lieber Standard-Reporting-Tools können es tun.[My] SQL Query Syntax, die foreach Verarbeitung erfordert

End DB ist ein Bugzilla unter MySQL

Das Problem ist ich Schleife durch die bug_activity müssen für bestimmte Änderungen suchen, um die übergeordneten Datensatz „gültig“ zu prüfen, wie? z.B. Pseudo-Logik wie

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 

Ich bin nicht sicher, wie dies zu tun, wie Web-Beispiele nur DECLARE und Schleifen zeigen aber, wie eine Schleife paßt in den „wählen Sie aus, in dem“ Code.

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 

Beispiel 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

Können Sie Ihre Anforderungen erklären, ein bisschen mehr? Sie können es wahrscheinlich ohne eine Schleife tun. SQL ist basisbasiert, Looping vereitelt den Zweck. – HoneyBadger

Antwort

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 

Die Auswahl kehrt bug_ids, die während der Periode, in 'IN RÜCKSTAND' und in 'BELEGT' Zustände waren. Sie können bugs_activity

UPDATE statt der Abfrage oben in Ihrer FROM Abschnitt verwenden:

hinzufügen

in der SELECT-Abschnitt
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 

und dann Abschnitt in HAVING AND backlogDate<assignedDate

+0

Dank gab diesen mir genug –

+0

Dank bekommt diese mir genug gab zu bekommen ' 'SELECT bug_id, SUM (CASE WHEN fielddefs.name =' bug_status UND bugs_activity.added = 'IN BESTEHT' THEN 1 ELSE 0 END) als backlogCount, SUMME (CASE WHEN fielddefs.name = 'bug_status' UND bugs_activity.added = 'ZUGEWIESEN' DANN 1 ELSE 0 ENDE) als assignedCount FROM bugs_activity, fielddefs WHERE bug_when BETWEEN '2016-03-01' UND '2016 -03-31 ' GROUP BY bug_id HAVING Rückstandszählung> 0 AND assignedCount> 0'' Wie verschiebe ich die "WHERE Bug_when" Logik in die Select - will StateA dann StateB StateB Inside-Datum zur Verfügung gestellt? Vielen Dank –