2013-09-29 13 views
5

Chcę wiedzieć, jak używać pętli do wypełniania brakujących dat o wartości zero w oparciu o daty rozpoczęcia/zakończenia przez grupy w sql, tak, że mam kolejne szeregi czasowe w każda grupa. Mam dwa pytania.Jak wypełnić brakujące terminy według grup w tabeli w sql

  1. jak zapętlić dla każdej grupy?
  2. Jak używać dat rozpoczęcia/zakończenia dla każdej grupy, aby dynamicznie wypełniać brakujące daty?

Moje wejście i oczekiwane wyniki są wymienione poniżej.

Wejście: Mam tabeli A jak

date  value  grp_no 
8/06/12 1   1 
8/08/12 1   1 
8/09/12 0   1 
8/07/12 2   2 
8/08/12 1   2 
8/12/12 3   2 

Również mam tabeli B, który może być używany do lewej przyłączyć A wypełnić brakujące terminach.

date 
... 
8/05/12 
8/06/12 
8/07/12 
8/08/12 
8/09/12 
8/10/12 
8/11/12 
8/12/12 
8/13/12 
... 

Jak używać A i B do generowania następującego wyniku w sql?

wyjściowa:

date  value  grp_no 
8/06/12 1   1 
8/07/12 0   1 
8/08/12 1   1 
8/09/12 0   1 
8/07/12 2   2 
8/08/12 1   2 
8/09/12 0   2 
8/10/12 0   2 
8/11/12 0   2 
8/12/12 3   2 

Proszę wysłać mi swój kod i sugestie. Z góry bardzo dziękuję!!!

+0

jakie są kolumny B? – mhn

+0

Ma tylko kolumnę z datą - wszystkie kolejne daty w roku 2012. – user2824423

+1

Jakiego systemu baz danych i wersji używasz? –

Odpowiedz

6

Można zrobić to w ten sposób bez pętli

SELECT p.date, COALESCE(a.value, 0) value, p.grp_no 
    FROM 
(
    SELECT grp_no, date 
    FROM 
    (
    SELECT grp_no, MIN(date) min_date, MAX(date) max_date 
     FROM tableA 
    GROUP BY grp_no 
) q CROSS JOIN tableb b 
    WHERE b.date BETWEEN q.min_date AND q.max_date 
) p LEFT JOIN TableA a 
    ON p.grp_no = a.grp_no 
    AND p.date = a.date 

Głębsza chwyta podzapytanie min i max pochodzi z każdej grupy. Następnie połączenie krzyżowe z TableB generuje wszystkie możliwe daty z zakresu min.-maks. Na grupę. I na koniec selekcja zewnętrzna używa sprzężenia zewnętrznego z TableA i wypełnia kolumnę value z 0 dla dat, których brakuje w TableA.

wyjściowa:

 
|  DATE | VALUE | GRP_NO | 
|------------|-------|--------| 
| 2012-08-06 |  1 |  1 | 
| 2012-08-07 |  0 |  1 | 
| 2012-08-08 |  1 |  1 | 
| 2012-08-09 |  0 |  1 | 
| 2012-08-07 |  2 |  2 | 
| 2012-08-08 |  1 |  2 | 
| 2012-08-09 |  0 |  2 | 
| 2012-08-10 |  0 |  2 | 
| 2012-08-11 |  0 |  2 | 
| 2012-08-12 |  3 |  2 | 

Oto SQLFiddle demo

+0

Dziękuję bardzo! Wypróbuję dzisiaj i dam znać, czy to działa! – user2824423

+1

Działa idealnie! Dziękuję bardzo. – user2824423

+0

@ user2824423 Serdecznie witamy. Powodzenia :) – peterm

Powiązane problemy