У меня есть одна таблица с несколькими столбцами. Мне нужно создать запрос SQL для отображения определенных столбцов на основе пользовательского ввода из средства выбора даты и поля выбора. Я сделал это просто отлично. Тем не менее, мне нужно, чтобы один из столбцов результатов был в нижней части таблицы отображения. Я не могу понять, как создать результат в моем текущем запросе для отображения итогового столбца. По сути, я хотел бы, чтобы столбец WTTotal был объединен в отдельную ячейку. Мой текущий запрос ниже. Я действительно думаю, что это что-то простое, что я просто не могу видеть.
SELECT REPLACE(Client,',',' ') AS Client,WorkTicketNum,Lease,Date,OrderedBy,WTTotal
FROM WorkTicket
WHERE Date BETWEEN '2014-10-01' AND '2014-10-31' AND Invoiced IS NULL
ORDER BY Client
SELECT REPLACE(Client,',',' ') AS Client,WorkTicketNum,Lease,Date,OrderedBy,WTTotal
FROM WorkTicket
WHERE Date BETWEEN '2014-10-01' AND '2014-10-31' AND Invoiced IS NULL
ORDER BY Client
UNION ALL
SELECT 'Total', NULL, NULL, NULL, NULL, SUM(WTTotal)
FROM WorkTicket
WHERE Date BETWEEN '2014-10-01' AND '2014-10-31' AND Invoiced IS NULL;
Вы не можете получить это с помощью одного запроса. Положить SUM()
в ваш запрос потребует GROUP BY
Сложите и сверните все исходные строки результатов в одну строку результатов — это означает, что ваша таблица исчезнет. То, что вы хотите, это клиентское решение. например Запустите счетчик в вашем клиентском коде и вручную сложите результаты. В псевдоиш-коде:
$sum = 0;
while( $row = fetch_from_db() ) {
$sum += $row['field_to_sum'];
display_row();
}
echo "Total: $sum";
Если вы хотите, чтобы он был в отдельном столбце, а не в отдельной строке, либо вы рассчитываете его в подзапросе и присоединяете его к своему результату:
SELECT REPLACE(Client,',',' ') AS Client,WorkTicketNum,Lease,Date,OrderedBy, my_calculated_sum AS WTTotal
FROM WorkTicket
JOIN (SELECT SUM(whatever_you_want_to_sum) as my_calculated_sum FROM WorkTicket) subquery_alias
WHERE Date BETWEEN '2014-10-01' AND '2014-10-31' AND Invoiced IS NULL
ORDER BY Client
Или вы просто рассчитываете это с переменными, как промежуточный итог. Ваш результат находится в последнем ряду столбца.
SELECT REPLACE(Client,',',' ') AS Client,WorkTicketNum,Lease,Date,OrderedBy, @sum_variable := @sum_variable + whatever_you_want_to_sum AS WTTotal
FROM WorkTicket
, (SELECT @sum_variable := 0) var_init_subquery
WHERE Date BETWEEN '2014-10-01' AND '2014-10-31' AND Invoiced IS NULL
ORDER BY Client
Но на самом деле решение Кевина очень хорошее.
У меня также есть решение, подобное Кевину:
;with cte_result
as
(
SELECT REPLACE(Client,',',' ') AS Client,WorkTicketNum,Lease,Date,OrderedBy,WTTotal
FROM WorkTicket
WHERE Date BETWEEN '2014-10-01' AND '2014-10-31' AND Invoiced IS NULL
)
select *
from cte_result
union
select 'TotalAmount',NULL,NULL,NULL,NULL,sum(WTTotal)
from cte_result
order by client
но это решение будет работать, только если ваш DB Engine поддерживает CTE.
с помощью CTE мы можем использовать тот же набор результатов, чтобы получить итоговую строку.