2016-04-21 16 views
-1

Ich habe eine Lösung für dieses Problem, aber ich weiß nicht, ob es der beste Weg ist, darüber zu gehen, damit ich nach besseren Alternativen suche.Zählen Teilnahme bis zum Tag

Ich versuche, die Teilnahme von Tag

Zeitraum zwischen zwei Wochen also zwei Menschen in einem Sport über 2 Wochen teilnehmen zu zählen

Person A Person b

Woche 1

Day 1: A, b 
DAY 2: A, b 
Day 3: a, b 
Day 4: a, b 
Day 5: a, b 

Woche 2

Day 1: A, B 
DAY 2: A 
DAY 3: A 
Day 4: A, B 
Day 5: B 

Deshalb möchte ich wissen, wie viele Teilnehmer hat mir in der vergangenen Woche im Vergleich So ist die Ausgabe wie

VERLUST aussehen: TAG 1: 0, Tag 2: 1, Tag 3: 1, Tag 4: 0 , Tag 5: 1

Also, was ich zur Zeit mache ist eine Unterabfrage in der where caluse und nicht mit in und Looping durch die Tage wie die

DECLARE @days table (d TIN 

INSERT INTO @days 
    VALUES(1), (2), (3), (4), (5), (6), (7) 

SELECT COUNT(Person), DayOfWeek 
FROM participation 
WHERE WEEK = Week1 
AND DAY = @day 
AND PERSON NOT IN (SELECT Person 
        FROM participation 
        WHERE WEEK = Week2 
        and Day = @day) 

figured it out

eine sehr sehr ähnliche Methode, um die Antwort Verwendet unter

WITH CTE AS 
(SELECT dayofweek, person 
FROM Participation 
Where week = week1) 

    SELECT DayOfWeek, COunt(CTE.Person), COunt(a.Person) 
    FROM CTE 
    LEFT JOIN (SELECT DayOfWeek, Person 
      FROM Participation 
      where week = week2)a 
    ON a.Person = CTE.Person 
    and a.dayofweek = cte.dayofweek 

ich mit einer berechneten Spalte ein #table dass in setzen und dann die min jeden Tag bekommen, und ich habe meine Antwort. Danke für die Hilfe

+1

Kein Weg, der funktioniert. Tag = @ Tag? Sie haben eine Tabelle mit @days. WOCHE = Woche1? – Paparazzi

+0

@Paparazzi Entschuldigung Es hat keinen Codeblock hinzugefügt, den ich dort hatte – WBratz

Antwort

1

Sie wollen Schleifen in SQL vermeiden - obwohl ich diese Schleife in Ihrem Code nicht sehen kann. Verwenden Sie einen Cursor, um @day zu füllen?

Wie dem auch sei, ich bin über Ihre Datentypen (oder die Tabellenstruktur) nicht sicher, aber week unter der Annahme ist eine Zeichenfolge, und alles in einem participation Tabelle gespeichert wird dann dies wird Ihnen den Verlust von Woche 1 bis Woche erhalten 2:

;with cte_people (week, DayOfWeek, person_count) 
as 
(
    select WEEK, DayOfWeek, count(person) 
    from participation 
    group by WEEK, DayOfWeek 
) 

select c1.DayOfWeek, c1.person_count - c2.person_count as loss 
from cte_people c1 
inner join cte_people c1 
on c2.DayOfWeek = c1.DayOfWeek 
and c2.week = 'Week2' 
where c1.week = 'Week1' 
+0

Es wird nicht lassen Sie mich die Abfrage mit der Schleife hinzufügen, aber ich fand es ähnlich wie Ihre mit CTE AS (SELECT DayOfWeek, Person von der Teilnahme WHERE Woche = week1) SELECT cte.PERSON, CTE.DayOfWeek, Graf (cte.Person), COUNT (a.Person) VON CTE LEFT JOIN DAYOFWEEK (SELECT, Person von der Teilnahme WHERE DAYOFWEEK = week2) a auf a.person = cte.person und a.dayofweek = cte.dayofweeK I inser dass das in eine Tabelle mit einer berechneten Spalte genommen wurde, nahm die Minute von jedem Tag und Viola bekam, was ich wollte minus die Schleife – WBratz

Verwandte Themen