SQL View отображает текущее состояние «единицы» для каждой даты, когда что-то меняется с «единицей» - PullRequest
0 голосов
/ 03 марта 2010

В проекте, над которым я работаю, есть таблица единиц, а затем есть несколько таблиц, которые относятся к расположению единиц в данный момент времени, а также к другим факторам для данного момента времени.

Например, Unit1 может находиться в LocationA 01.01.2009 и иметь вторую запись местоположения, в которой Unit1 находится в LocationB 01.03.2010. Аналогично, Единица 1 может быть размером 1 от 20.02.2009 и размером 2 от 12 декабря 2010 года.

Структура стола

Table: Unit  
int ID (identity, PK)  
varchar Name  

Table: Unit_Location  
int OrgID (FK Unit.ID)  
datetime eff_date  
int LocationID (FK Location.ID)  

Table: Unit_Size  
int OrgID (FK Unit.ID)  
datetime eff_date  
int UnitSizeID (FK Size.ID) 

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

1/1/2009  - Unit1 - LocationA - Null  
2/20/2009 - Unit1 - LocationA - Size1  
1/12/2010 - Unit1 - LocationA - Size2  
3/1/2010  - Unit1 - LocationB - Size2  

Если я сделаю полное внешнее объединение, основанное на датах вступления в силу, я полагаю, что могу легко добраться до:

1/1/2009  - Unit1 - LocationA - Null  
2/20/2009 - Unit1 - Null      - Size1  
1/12/2010 - Unit1 - Null      - Size2  
3/1/2010  - Unit1 - LocationB - Null  

Но это не совсем помогает мне достичь того, чего я хочу. Как должен выглядеть мой SQL, чтобы получить представление с полным статусом каждого модуля на каждую дату, когда что-то с модулем изменяется? enter code here

1 Ответ

0 голосов
/ 03 марта 2010

попробуй:

--I added more test data :-)
DECLARE @Unit table (ID int identity(1,1) primary key  ,Name  varchar(10))
INSERT INTO @Unit (Name) VALUES ('Unit 1')
INSERT INTO @Unit (Name) VALUES ('Unit 2')

DECLARE @Unit_Location table (OrgID int,eff_date datetime,Location varchar(10))
INSERT INTO @Unit_Location VALUES (1,'01/01/2009','LocationA')
INSERT INTO @Unit_Location VALUES (1,'03/01/2010','LocationB')
INSERT INTO @Unit_Location VALUES (2,'03/03/2010','Locationz')

DECLARE @Unit_Size table (OrgID int, eff_date datetime, UnitSize varchar(10))
INSERT INTO @Unit_Size VALUES (1,'02/20/2009','Size1')
INSERT INTO @Unit_Size VALUES (1,'01/12/2010','Size2')
INSERT INTO @Unit_Size VALUES (2,'01/02/2010','Size9')


;WITH AllDates AS
(
    SELECT OrgID,eff_date FROM @Unit_Location
    UNION 
    SELECT OrgID,eff_date FROM @Unit_Size

), AllPKs AS
(
SELECT 
    a.OrgID,a.eff_date
    ,(SELECT MAX(l.eff_date) FROM @Unit_Location l WHERE l.eff_date<=a.eff_date AND a.OrgID=l.OrgID) AS LocationPK
    ,(SELECT MAX(s.eff_date) FROM @Unit_Size     s WHERE s.eff_date<=a.eff_date AND a.OrgID=s.OrgID) AS SizePK
    FROM AllDates a
)
SELECT
    a.eff_date, u.Name, l.Location, s.UnitSize
    FROM AllPKs                        a
        LEFT OUTER JOIN @Unit          u ON a.OrgID=u.ID
        LEFT OUTER JOIN @Unit_Location l ON a.LocationPK=l.eff_date AND a.OrgID=l.OrgID
        LEFT OUTER JOIN @Unit_Size     s ON a.SizePK=s.eff_date AND a.OrgID=s.OrgID
    ORDER BY u.Name,a.eff_date

ВЫВОД:

eff_date                Name       Location   UnitSize
----------------------- ---------- ---------- ----------
2009-01-01 00:00:00.000 Unit 1     LocationA  NULL
2009-02-20 00:00:00.000 Unit 1     LocationA  Size1
2010-01-12 00:00:00.000 Unit 1     LocationA  Size2
2010-03-01 00:00:00.000 Unit 1     LocationB  Size2
2010-01-02 00:00:00.000 Unit 2     NULL       Size9
2010-03-03 00:00:00.000 Unit 2     Locationz  Size9

(6 row(s) affected)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...