SQL Server Добавляет X строк к результатам, чтобы они всегда были равны 5 строкам - PullRequest
0 голосов
/ 24 октября 2018

У меня есть код, который возвращает последние 5 результатов для любого заданного идентификатора (включая указанный идентификатор).Я хочу вернуть дополнительные строки со словом none и 00 соответственно, если предыдущие значения не равны 5.

Так, если код возвращает 3 результата, генерируются 2 дополнительные строки, есликод возвращает 4 результата, генерирует 1 дополнительную строку.

Текущий код: (aaa.FS01 = '12345') является просто примером идентификатора

SELECT aaa.FS01,
CAST(COUNT(distinct bbb.MG) AS FLOAT)/ convert(varchar(10), DATEDIFF(second ,MIN(TP), MAX(TP))/3600.0) TPDIFF,
22 TAG
FROM TableA aaa
INNER JOIN TableB bbb ON bbb.tpl = aaa.FS01 OR bbb.fpl = aaa.FS01
INNER JOIN TableC ccc ON ccc.id = aaa.FS01
INNER JOIN TableD ddd ON aaa.VG = ddd.gkey
WHERE aaa.FS01 IN (
SELECT TOP 5 ccc.id 
FROM TableA aaa
INNER JOIN TableC ccc ON ccc.id = aaa.FS01
INNER JOIN TableD v ON aaa.VG = ddd.gkey
WHERE ddd.name = (SELECT ddd.name FROM TableA aaa
INNER JOIN TableD v ON aaa.VG = ddd.gkey WHERE aaa.FS01 = '12345')
ORDER BY ccc.ata DESC) 
GROUP BY aaa.FS01, ccc.ata
ORDER BY ccc.ata DESC

Текущий вывод (для FS01, который возвращает только3 значения):

FS01    TPDIFF   TAG
12345   30       22
22222   50       22
45122   90       22

Ожидаемый выход (Для FS01, который возвращает только 3 значения):

FS01    TPDIFF   TAG
12345   30       22
22222   50       22
45122   90       22
none    00       22
none    00       22

Токовый выход (Для FS01, который возвращает только 1 значение):

FS01    TPDIFF   TAG
74133   30       22

Ожидаемый результат (для FS01, который возвращает только 1 значение):

FS01    TPDIFF   TAG
74133   80       22
none    00       22
none    00       22
none    00       22
none    00       22

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Вы можете сделать это с помощью одного запроса:

with t as (<your query here>),
     nones as (
      select 'none' as FS01, '00' as TPDIFF, '22' as TAG
      from (values (1), (2), (3), (4), (5))
     )
select top (5) tn.FS01, tn.TPDIFF, tn.TAG
from ((select t.* from t) union all
      nones
     ) tn
order by (case when FS01 = 'none' then 1 else 2 end) as asc;
0 голосов
/ 24 октября 2018

Я бы объявил переменную таблицы следующим образом.Затем используйте некоторое время для добавления пустых строк.

Примерно так:

DECLARE @tbl AS TABLE(FS01 text, TPDIFF text, TAG Text);
INSERT INTO @tbl (FS01, TPDIFF, TAG) 

--your select statement (copied)
SELECT aaa.FS01,
CAST(COUNT(distinct bbb.MG) AS FLOAT)/ convert(varchar(10), DATEDIFF(second ,MIN(TP), MAX(TP))/3600.0) TPDIFF,
22 TAG
FROM TableA aaa
INNER JOIN TableB bbb ON bbb.tpl = aaa.FS01 OR bbb.fpl = aaa.FS01
INNER JOIN TableC ccc ON ccc.id = aaa.FS01
INNER JOIN TableD ddd ON aaa.VG = ddd.gkey
WHERE aaa.FS01 IN (
SELECT TOP 5 ccc.id 
FROM TableA aaa
INNER JOIN TableC ccc ON ccc.id = aaa.FS01
INNER JOIN TableD v ON aaa.VG = ddd.gkey
WHERE ddd.name = (SELECT ddd.name FROM TableA aaa
INNER JOIN TableD v ON aaa.VG = ddd.gkey WHERE aaa.FS01 = '12345')
ORDER BY ccc.ata DESC) 
GROUP BY aaa.FS01, ccc.ata
ORDER BY ccc.ata DESC


declare @cnt as int;
SELECT @cnt = count(*) from @tbl

while @cnt < 5
    BEGIN
        insert into @tbl (FS01, TPDIFF, TAG) VALUES('none', '00', '22');
        select @cnt = @cnt+1;
    end

select top 5 * from @tbl;
...