2017-02-23 102 views
-1

Я хочу получить статус NEW и тип DATA, всегда самую последнюю сумму для контракта, которая не является NULL.Получить значение из строк в одной таблице

 
CREATE TABLE mytable(
    Amount VARCHAR(4) NULL 
    ,Status VARCHAR(5) NOT NULL 
    ,Date DATE NOT NULL 
    ,Type VARCHAR(4) NOT NULL 
    ,MetaKey INTEGER NOT NULL 
); 
INSERT INTO mytable(Amount,Status,Date,Type,MetaKey) VALUES ('150','TRANS','2017-01-01','DATA',6); 
INSERT INTO mytable(Amount,Status,Date,Type,MetaKey) VALUES ('150','TRANS','2017-01-02','DATA',7); 
INSERT INTO mytable(Amount,Status,Date,Type,MetaKey) VALUES ('150','TRANS','2017-01-03','DATA',8); 
INSERT INTO mytable(Amount,Status,Date,Type,MetaKey) VALUES ('150','TRANS','2017-01-04','DATA',9); 
INSERT INTO mytable(Amount,Status,Date,Type,MetaKey) VALUES ('150','TRANS','2017-01-05','DATA',10); 
INSERT INTO mytable(Amount,Status,Date,Type,MetaKey) VALUES ('150','TRANS','2017-01-06','DATA',11); 
INSERT INTO mytable(Amount,Status,Date,Type,MetaKey) VALUES ('150','TRANS','2017-01-07','DATA',12); 
INSERT INTO mytable(Amount,Status,Date,Type,MetaKey) VALUES ('150','TRANS','2017-01-08','DATA',13); 
INSERT INTO mytable(Amount,Status,Date,Type,MetaKey) VALUES ('150','TRANS','2017-01-09','DATA',14); 
INSERT INTO mytable(Amount,Status,Date,Type,MetaKey) VALUES ('150','TRANS','2017-01-10','DATA',15); 
INSERT INTO mytable(Amount,Status,Date,Type,MetaKey) VALUES ('150','TRANS','2017-01-11','DATA',16); 
INSERT INTO mytable(Amount,Status,Date,Type,MetaKey) VALUES ('150','TRANS','2017-01-12','DATA',17); 
INSERT INTO mytable(Amount,Status,Date,Type,MetaKey) VALUES ('150','TRANS','2017-01-13','DATA',18); 
INSERT INTO mytable(Amount,Status,Date,Type,MetaKey) VALUES ('150','TRANS','2017-01-14','DATA',19); 
INSERT INTO mytable(Amount,Status,Date,Type,MetaKey) VALUES ('150','TRANS','2017-01-15','DATA',20); 
INSERT INTO mytable(Amount,Status,Date,Type,MetaKey) VALUES ('150','TRANS','2017-01-16','DATA',21); 
INSERT INTO mytable(Amount,Status,Date,Type,MetaKey) VALUES ('150','TRANS','2017-01-17','DATA',22); 
INSERT INTO mytable(Amount,Status,Date,Type,MetaKey) VALUES ('150','TRANS','2017-01-18','DATA',23); 
INSERT INTO mytable(Amount,Status,Date,Type,MetaKey) VALUES ('150','TRANS','2017-01-19','DATA',24); 
INSERT INTO mytable(Amount,Status,Date,Type,MetaKey) VALUES ('150','TRANS','2017-01-20','DATA',25); 
INSERT INTO mytable(Amount,Status,Date,Type,MetaKey) VALUES ('150','TRANS','2017-01-21','DATA',26); 
INSERT INTO mytable(Amount,Status,Date,Type,MetaKey) VALUES ('150','TRANS','2017-01-22','DATA',27); 
INSERT INTO mytable(Amount,Status,Date,Type,MetaKey) VALUES ('150','TRANS','2017-01-23','DATA',28); 
INSERT INTO mytable(Amount,Status,Date,Type,MetaKey) VALUES ('150','TRANS','2017-01-24','DATA',29); 
INSERT INTO mytable(Amount,Status,Date,Type,MetaKey) VALUES ('150','TRANS','2017-01-25','DATA',30); 
INSERT INTO mytable(Amount,Status,Date,Type,MetaKey) VALUES ('150','TRANS','2017-01-26','DATA',31); 
INSERT INTO mytable(Amount,Status,Date,Type,MetaKey) VALUES (NULL,'NEW','2017-01-27','DATA',32); 
INSERT INTO mytable(Amount,Status,Date,Type,MetaKey) VALUES (NULL,'NEW','2017-01-28','DATA',33); 
INSERT INTO mytable(Amount,Status,Date,Type,MetaKey) VALUES (NULL,'NEW','2017-01-29','DATA',34); 
INSERT INTO mytable(Amount,Status,Date,Type,MetaKey) VALUES (NULL,'NEW','2017-01-30','DATA',35); 

Ожидаемый выход являются:

 
+--------+--------+------------+------+---------+ 
| Amount | Status | Date | Type | MetaKey | 
+--------+--------+------------+------+---------+ 
| 150 | TRANS | 2017-01-01 | DATA |  6 | 
| 150 | TRANS | 2017-01-02 | DATA |  7 | 
| 150 | TRANS | 2017-01-03 | DATA |  8 | 
| 150 | TRANS | 2017-01-04 | DATA |  9 | 
| 150 | TRANS | 2017-01-05 | DATA |  10 | 
| 150 | TRANS | 2017-01-06 | DATA |  11 | 
| 150 | TRANS | 2017-01-07 | DATA |  12 | 
| 150 | TRANS | 2017-01-08 | DATA |  13 | 
| 150 | TRANS | 2017-01-09 | DATA |  14 | 
| 150 | TRANS | 2017-01-10 | DATA |  15 | 
| 150 | TRANS | 2017-01-11 | DATA |  16 | 
| 150 | TRANS | 2017-01-12 | DATA |  17 | 
| 150 | TRANS | 2017-01-13 | DATA |  18 | 
| 150 | TRANS | 2017-01-14 | DATA |  19 | 
| 150 | TRANS | 2017-01-15 | DATA |  20 | 
| 150 | TRANS | 2017-01-16 | DATA |  21 | 
| 150 | TRANS | 2017-01-17 | DATA |  22 | 
| 150 | TRANS | 2017-01-18 | DATA |  23 | 
| 150 | TRANS | 2017-01-19 | DATA |  24 | 
| 150 | TRANS | 2017-01-20 | DATA |  25 | 
| 150 | TRANS | 2017-01-21 | DATA |  26 | 
| 150 | TRANS | 2017-01-22 | DATA |  27 | 
| 150 | TRANS | 2017-01-23 | DATA |  28 | 
| 150 | TRANS | 2017-01-24 | DATA |  29 | 
| 150 | TRANS | 2017-01-25 | DATA |  30 | 
| 160 | TRANS | 2017-01-26 | DATA |  31 | 
| 160 | NEW | 2017-01-27 | DATA |  32 | 
| 160 | NEW | 2017-01-28 | DATA |  33 | 
| 160 | NEW | 2017-01-29 | DATA |  34 | 
| 160 | NEW | 2017-01-30 | DATA |  35 | 
+--------+--------+------------+------+---------+ 

Я попытался с крестом применить, но это отнимает много времени. Можно ли обойтись без креста?

+1

Пожалуйста научиться форматировать ваши сообщения –

+0

Последние средства? как 160 пришёл на 2017-01-26? Какова его логика? –

+0

Все типы статуса NEW имеет значение Null в виде суммы. Они должны получить последнюю существующую сумму, то есть 160. Сумма - это просто значение, которое я получаю из файла каждый день. – vasdan

ответ

1
Declare @LatestAmount VARCHAR(4)= (select Amount FROM mytable WHERE Date = (SELECT MAX(Date) FROM mytable WHERE Amount IS NOT NULL)) 

SELECT Amount,Status,Date,Type,MetaKey FROM mytable WHERE Status= 'TRANS' AND Type='DATA' 
UNION 
SELECT ISNULL(Amount,@LatestAmount),Status,Date,Type,MetaKey FROM mytable WHERE Status= 'NEW' AND Type='DATA' 
ORDER BY Date 
1

Вы пробовали что-то вроде этого:

SELECT 
    COALESCE(T1.amount,t2.amount) amount 
    ,T1.Status 
    ,T1.DATE 
    ,T1.Type 
    ,T1.MetaKey 
FROM mytable T1 
LEFT JOIN 
    (
    SELECT TOP 1 amount 
    FROM mytable 
    WHERE TYPE = 'DATA' 
    AND amount IS NOT NULL 
    ORDER BY DATE DESC 
    ) T2 
    ON T2.Amount IS NOT NULL 
    AND T1.amount IS NULL 
;