2013-04-26 5 views
-1

У меня есть SQL-скрипт, который возвращает эту производную таблицу.Добавление отсутствующих строк с соединением

MM/YYYY Cat Score 
02/2012 Test1 19 
04/2012 Test1 15 
05/2012 Test1 16 
07/2012 Test1 14 
08/2012 Test1 15 
09/2012 Test1 15 
12/2012 Test1 11 
02/2012 Test2 15 
03/2012 Test2 13 
05/2012 Test2 18 
06/2012 Test2 14 
08/2012 Test2 15 
09/2012 Test2 14 
12/2012 Test2 10 

Как вы можете видеть, я пропускаю некоторые MM/YYYYs (03/2012, 06/2012, 11/2012 и т.д.).

Я хотел был бы заполнить отсутствующие MM/YYYY с Cat & a 0 (ноль) сформировать счет. Я знаю, какова дата начала (1/2012).

Я попытался присоединиться к таблице, содержащей все MM/YYYY для диапазонов запроса, но это возвращает только отсутствующие строки для первого вхождения, это не повторяется для каждой кошки (должно было быть известно что).

Итак, мой вопрос в том, могу ли я сделать это с помощью соединения или мне нужно сделать это в таблице темп, а затем вывести данные. Я ищу, чтобы вернуть таблицу, которая имеет 24 строки, для диапазона дат от 1/2012 до 12/2012, с соответствующим Cat (Test1 & Test2) & соответствующий балл, если он существует, или ноль, если он не был в оригинальная таблица.

AHIGA, LarryR ...

+0

Как вы присоединились к своему столу со всеми датами? – a1ex07

+0

есть ли у вас отдельная таблица категорий? можете ли вы опубликовать все таблицы, используемые в вашем запросе, для возврата результатов? –

ответ

3

Вот пример того, как можно использовать некоторые КТР, чтобы получить то, что вы после этого. Это использует три CTE: один для всех дат, один для ваших категорий, затем третий, чтобы скрестить их. Третий действительно лишний, но это просто сделать его более очевидным, на что мы смотрим.

DECLARE 
    @StartDate datetime = '2/1/2012' 
    ,@EndDate datetime = '4/26/2013' 
;WITH DATES AS 
(
    SELECT 
     CAST(MONTH(@StartDate) as varchar(20)) + '/' + CAST(YEAR(@StartDate) as varchar(20)) 'CurrMonth' 
     ,@StartDate as Datefield 
    UNION ALL 
    SELECT 
     CAST(MONTH(CurrDate) as varchar(20)) + '/' + CAST(YEAR(CurrDate) as varchar(20)) 
     ,CurrDate 
    FROM 
     DATES 
    CROSS APPLY (SELECT DATEADD(month, 1, Datefield)) CxA(CurrDate) 
    WHERE CurrDate < @EndDate 
) 
,CATS AS 
(
    SELECT 'Test1' as 'Cat' 
    UNION ALL 
    SELECT 'Test2' 
) 
,AllTheThings AS 
(
    SELECT 
     Datefield 
     ,CurrMonth 
     ,Cat 
    FROM 
     DATES D 
    CROSS JOIN 
     CATS C 
) 

SELECT * FROM AllTheThings 
+0

благодаря миллиону. Это сделало трюк !!!! – larryr

0

Лучшее решение для создания таблицы дат (по временной таблицы). Это занимает очень мало места.

+0

Когда таблица даты соединена, только одно заполнение отсутствующих дат объединяется, а Cat - NULL. – larryr

+0

@larryr Я не следую. – Kermit

+0

Если я присоединяюсь к таблице дат, пропущенные даты появятся только один раз, а Cat col будет NULL. – larryr

2

Если я understodd правильно, вы бы присоединиться к вашей таблице как этот

SELECT 
    d.Date,c.Cat,ISNULL(t.Score,0) As Score 
FROM YourDateTable d 
CROSS JOIN 
(-- Your Cat Table or UNION Cat here 
    SELECT 'Test1' AS Cat 
    UNION ALL 
    SELECT 'Test2' 
) c 
LEFT JOIN YourCurrentTable t 
    ON t.Date = d.Date 
    AND t.Cat = c.Cat