Моя таблица выглядит так:
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';
Вы можете использовать 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;
Так что в основном взять 500
и объединить его с 400
?
SELECT Dept, SUM(Wk1) AS Wk1, SUM(Wk2) AS Wk2
FROM yourtable
GROUP BY Dept IN (400,500), Dept
Это не редкая проблема в отчетности. Типичный метод для этого — создать временную таблицу, в которой вы можете изменить 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.