Страницы

Поиск по вопросам

воскресенье, 15 марта 2020 г.

Разбить строку результата на две в MS SQL

#sql #sql_server


Подскажите решение вот такой вот смарт-задачки: имеем результат выборки



В результате появляется строка, где в двух колонках и FixHours, и AddHours есть значения
не равные нулю:

FixHours = 0,5 AddHours = 1,5 CalculatedValue = 16.5

Как ее можно разделить на две, чтобы получить строки:

FixHours = 0,5 AddHours = 0 CalculatedValue = 16.5

FixHours = 0 AddHours = 1,5 CalculatedValue = 16.5

Была идея находить только эту строку, затем искусственно создавать вторую с помощью
Union. Но она провалилась, т.к. такие строки в таблице встречаются не один раз. В общем,
any ideas?
    


Ответы

Ответ 1



Если порядок не важен, то: WITH SourceData AS ( SELECT FixHours, AddHours, CalculatedValue FROM SomeTable --тут ваша выборка ) SELECT FixHours, 0, CalculatedValue FROM SourceData WHERE FixHours <> 0 UNION ALL SELECT 0, AddHours, CalculatedValue FROM SourceData WHERE AddHours <> 0 UNION ALL SELECT 0, 0, CalculatedValue FROM SourceData WHERE FixHours = 0 AND AddHours = 0 Если важен - то нужно добавлять rownumber в SourceData, и сортировать результат union по нему.

Ответ 2



Если есть желание без всяких юнионов, можно сделать join на таблицу, которая возвращает 2 записи и дальше уже по условиям выбирать, что показывать. Т.е. что-нибудь вроде такого варианта (не тестировал, но должно работать, за производительность такого решения также не ручаюсь): select case spt.number when 0 then t.FixHours else 0 end as FixHours, case spt.number when 1 then t.AddHours else 0 end as AddHours, t.CalculatedValue from table t join master..spt_values spt on spt.type='p' and spt.number in (0,1) and ((t.FixHour > 0 and spt.number = 0) or (t.AddHours > 0 and spt.number = 1) or (t.FixHour = 0 and t.AddHours = 0 and spt.number = 0))

Ответ 3



select fixhours,0,calculatevalue from a where a.fixhours!=0 and a.addhours!=0 union select 0 ,addhours, calculatevalue from a where a.fixhours!=0 and a.addhours!=0 Пример решения

Ответ 4



;WITH cte (FixHours, AddHours, CalculatedValue) AS ( -- тут должен быть запрос, возвращающий исходную таблицу SELECT 10, 0, 14 UNION ALL SELECT 0.5, 0, 14.5 UNION ALL SELECT 0.5, 1.5, 16.5 UNION ALL SELECT 0, 0.5, 17 UNION ALL SELECT 7, 0.75, 17.75 UNION ALL SELECT 0, 2, 19.75 ) SELECT FixHours, AddHours, CalculatedValue FROM cte WHERE FixHours = 0 OR AddHours = 0 UNION ALL SELECT FixHours, 0, CalculatedValue FROM cte WHERE FixHours <> 0 AND AddHours <> 0 UNION ALL SELECT 0, AddHours, CalculatedValue FROM cte WHERE FixHours <> 0 AND AddHours <> 0 ORDER BY CalculatedValue -- ну или какой там требуется быть порядок

Комментариев нет:

Отправить комментарий