Quantcast
Channel: SQL.ru: Firebird, InterBase
Viewing all articles
Browse latest Browse all 1677

Как развернуть таблицу по горизонтали

$
0
0
Добрый день.
Читал вот эту тему: 10187341 - не помогло, поэтому создаю новую тему.
Прикрепляю SQL файл где создается БД, таблица и вставляются данные.

Некоторые пояснения.
Имеем таблицу тарифов на жилищно-коммунальные услуги. Это фрагмент таблица. На самом деле полей и дат больше, но привожу только ключевые поля/даты.
Пояснения к таблице:
+
CREATE TABLE TMP_TARIF (
    BD        SMALLINT,			-- номер БД
    DATA_TR   TIMESTAMP NOT NULL,	-- Начало действия
    DATA_E    TIMESTAMP,		-- Дата окончания (DATA_R-1)
    DATA_R    TIMESTAMP NOT NULL,	-- дата регистрации 
    NUMB      SMALLINT,			-- тип услуг
    TARN      SMALLINT,			-- номер системы
    COD_POSL  SMALLINT,			-- код услуги
    COD_RIZN  SMALLINT);		-- код разновидности

Мне нужно получить развернутую таблицу по горизонтали по полю DATA_TR.
Сначала все поля с датой 01/12/2016, потом 01/10/2015 и в завершение 01/09/2014.

Проблема заключается в том что может быть несколько строк с разными DATA_E и DATA_R.
для BD=2 вот такая картина:
+
2	01.10.2015	21.10.2015	01.10.2015	1	0	2	1
2	01.10.2015	21.10.2015	01.10.2015	1	0	2	4
2	01.10.2015	21.10.2015	01.10.2015	1	0	2	5
2	01.10.2015	21.10.2015	01.10.2015	1	0	2	7
2	01.10.2015	21.10.2015	01.10.2015	1	0	2	8
2	01.10.2015	21.10.2015	01.10.2015	1	0	2	9

2	01.10.2015	05.11.2015	22.10.2015	1	0	2	1
2	01.10.2015	05.11.2015	22.10.2015	1	0	2	4
2	01.10.2015	05.11.2015	22.10.2015	1	0	2	5
2	01.10.2015	05.11.2015	22.10.2015	1	0	2	7
2	01.10.2015	05.11.2015	22.10.2015	1	0	2	8
2	01.10.2015	05.11.2015	22.10.2015	1	0	2	9
2	01.10.2015	05.11.2015	22.10.2015	1	0	2	13
2	01.10.2015	05.11.2015	22.10.2015	1	0	2	12
2	01.10.2015	05.11.2015	22.10.2015	1	0	2	10
2	01.10.2015	05.11.2015	22.10.2015	1	0	2	11

Как видно для cod_rizn 1,4,5,7,8,9 есть 2 DATA_E и DATA_R: 21/10/2015, 05/11/2015 и 01/10/2015, 22/10/2015 соответственно.
Мне нужно выбрать последние (максимальные) значения.

Так же количество значений тоже может быть разное, например для той же BD=2 количество строк (если брать только нужные даты) для 01/12/2016 и 01/10/2015 - 10 строк, а для 01/09/2016 - 6 строк.


Пытался сделать так:
+
select tr1.bd, tr1.DATA_TR, tr1.DATA_E, tr1.DATA_R, tr1.NUMB, tr1.TARN, tr1.COD_POSL, tr1.COD_RIZN,
  tr2.bd, tr2.DATA_TR, tr2.DATA_E, tr2.DATA_R, tr2.NUMB, tr2.TARN, tr2.COD_POSL, tr2.COD_RIZN,
  tr3.bd, tr3.DATA_TR, tr3.DATA_E, tr3.DATA_R, tr3.NUMB, tr3.TARN, tr3.COD_POSL, tr3.COD_RIZN
  from tmp_tarif tr1

  join tmp_tarif tr2 on ( tr1.bd = tr2.bd
                      and tr1.numb = tr2.NUMB
                      and tr1.tarn = tr2.tarn
                      and tr1.cod_posl = tr2.cod_posl
                      and tr1.cod_rizn = tr2.cod_rizn)

  join tmp_tarif tr3 on ( tr1.bd = tr3.bd
                      and tr1.numb = tr3.NUMB
                      and tr1.tarn = tr3.tarn
                      and tr1.cod_posl = tr3.cod_posl
                      and tr1.cod_rizn = tr3.cod_rizn)
 where tr1.data_tr=cast('01.12.2016' as timestamp)
   and tr2.data_tr=cast('01.10.2015' as timestamp)
   and tr3.data_tr=cast('01.09.2015' as timestamp)

Но, скорее всего, из-за того что есть несколько строк на 1 значение cod_rizn - результат пустой.
Пробовал как в упомянутом сообщении применить LEFT JOIN - результат тот же, НИЧЕГО
Что я неправильно делаю и как правильно добавить условие по выбору максимальной даты (DATA_E и DATA_R) из нужной мне DATA_TR?

--------------------------
Firebird 3.0.1.32609;
IBExpert 2017.2.7.1;
Windows 10 32-bit;
4Gb RAM;
SSD 512Mb + HDD 1 Tb;
Настройки по умолчанию

Viewing all articles
Browse latest Browse all 1677

Trending Articles