Слияние строк в SQL

Моя таблица выглядит так:

Dept          Wk1          Wk2
100           25           50
200           25           50
300           25           50
400           25           50
500           25           50

Мои результаты должны выглядеть так:

Dept          Wk1          Wk2
100           25           50
200           25           50
300           25           50
400           50           100

Вещи, которые стоит отметить; база данных Pervasive PSQL10, и я использую PHP для обработки результатов. Я думал об этом слиянии в PHP, но в идеале, если бы это можно было сделать в запросе, это избавило бы меня от необходимости дополнительного кода.

Причиной объединения строк является то, что при извлечении данных две точки будут считаться одной.

Я думаю, что обдумываю это, но я изучил объединение, группирование и прочее (что я, вероятно, использую неправильно), и ничто не дает мне то, что мне нужно.

Буду признателен за любую помощь или направление, потому что то, что я до сих пор читал, касается строк, которые имеют одинаковые значения, но не отличаются.

Вот как на самом деле выглядит мой запрос:

SELECT
dept_workcenter,
SUM(case when right(date_sequence,2) between 0 and 7 then hours_worked else 0 end) as wk1,
SUM(case when right(date_sequence,2) between 8 and 14 then hours_worked else 0 end) as wk2,
SUM(case when right(date_sequence,2) between 15 and 21 then hours_worked else 0 end) as wk3,
SUM(case when right(date_sequence,2) between 22 and 28 then hours_worked else 0 end) as wk4,
SUM(case when right(date_sequence,2) between 29 and 31 then hours_worked else 0 end) as wk5
FROM job_detail
WHERE job between '017079' AND '017207'
AND date_sequence BETWEEN '141200' and '141231'
AND dept_workcenter != ''
GROUP BY dept_workcenter
HAVING SUM(hours_worked) <> '0'
AND SUM(hours_worked) > '0.05';

0

Решение

Вы можете использовать case заявление в group by:

select (case when dept in (400, 500) then 400 else dept end) as dept,
sum(wk1) as wk1, sum(wk2) as wk2
from table t
group by (case when dept in (400, 500) then 400 else dept end)
order by dept;
0

Другие решения

Так что в основном взять 500 и объединить его с 400?

SELECT Dept, SUM(Wk1) AS Wk1, SUM(Wk2) AS Wk2
FROM yourtable
GROUP BY Dept IN (400,500), Dept
0

Это не редкая проблема в отчетности. Типичный метод для этого — создать временную таблицу, в которой вы можете изменить 500 на 400, а затем сделать GROUP BY а также SUM, Этот метод станет более полезным, чем сложнее ваши отчеты со временем.

create table #DeptReptTable from select * from department;

update #DeptReptTable set Dept = 400 where Dept = 500;

select Dept, SUM(Wk1) Wk1, SUM(Wk2) Wk2 from #DeptReptTable group by Dept

drop table #DeptReptTable

Обратите внимание # перед временной таблицей находится Sybase-ism, который создаст таблицу, привязанную к текущему соединению / сеансу SQL. Я не знаю, работает ли эта магия на Pervasive.

0
По вопросам рекламы [email protected]