Разбить одну запись на несколько

Обычно это работает наоборот, но я хотел бы разбить отдельные записи на несколько записей через SQL.

Мы храним диапазон с датой начала и окончания, но нам нужно экспортировать запись для каждого года в диапазоне.

Пример: TECH_ID имеет begin_date 2009 года и end_date 2011 года. Нам нужно экспортировать 3 записи 2009, 2010 и 2011 годов.

Как это можно сделать?


person Andy Levesque    schedule 06.11.2012    source источник
comment
какую СУБД вы используете? Можете ли вы опубликовать некоторые образцы данных, а затем желаемый результат?   -  person Taryn    schedule 07.11.2012
comment
Извлечение из ODBC и экспорт в CSV для загрузки по FTP.   -  person Andy Levesque    schedule 07.11.2012


Ответы (3)


Вам нужна таблица чисел:

CREATE TABLE Numbers
(
    Number INT NOT NULL,
    CONSTRAINT PK_Numbers 
        PRIMARY KEY CLUSTERED (Number)
        WITH FILLFACTOR = 100
)

INSERT INTO Numbers
SELECT
    (a.Number * 256) + b.Number AS Number
FROM 
    (
        SELECT number
        FROM master..spt_values
        WHERE 
            type = 'P'
            AND number <= 255
    ) a (Number),
    (
        SELECT number
        FROM master..spt_values
        WHERE 
            type = 'P'
            AND number <= 255
    ) b (Number)
GO

Теперь, когда у вас есть таблица чисел...

SELECT DISTINCT
    n.Number
FROM
    Numbers n 
    JOIN TECH_ID t 
        ON n.Number BETWEEN t.begin_date AND t.end_date
person Michael Fredrickson    schedule 06.11.2012
comment
А! Именно то, что я искал! Спасибо! - person Andy Levesque; 07.11.2012

Создайте таблицу со строкой за год (у некоторых СУБД есть ярлыки). Тогда сделайте

Select
  t.*,
  y.Year
From
  Years y
    Inner Join
  tech_id t
    On Year(t.begin_date) <= y.Year And Year(t.end_date) >= y.Year
person Laurence    schedule 06.11.2012

Когда я прочитал ваш вопрос, в нем не было четкого упоминания об образцах данных. Кстати, я написал это в качестве примера, чтобы поставить одну запись на три записи, исходя из того, что у вас есть.

Select  *
    From    (
        Select  1   As  Id
        ,   'Test'  As  Name
    )   As  SampleRecord
    Cross   Join
        (
        Select  2009    As  Year
    Union   Select  2010
    Union   Select  2011
    )   As  Years

Ваше здоровье

person Rikki    schedule 06.11.2012