SQL Запрос суммы с условиями - PullRequest
0 голосов
/ 18 февраля 2020

У меня возникают трудности с поиском нужного мне запроса в поисках помощи. После нескольких JOIN и множества WHERE у меня есть следующие столбцы и значения:

+---------+----------+--------+-------+
| id_test | quantity | price  |  fee  |
+---------+----------+--------+-------+
| "1-3"   |        1 | 33.52  | 29.00 |
| "1-5"   |        1 | 33.52  | 29.00 |
| "1-6"   |        1 | 33.52  | 29.00 |
| "1-8"   |        1 | 86.49  | 29.00 |
| "19-1"  |        1 | 176.54 | 29.00 |
| "19-4"  |        1 | 176.54 | 29.00 |
| "19-5"  |        4 | 176.54 | 29.00 |
| "19-6"  |        1 | 199.47 | 29.00 |
| "19-6"  |        1 | 176.54 | 29.00 |
| "20-10" |        2 | 72.67  | 29.00 |
| "20-11" |        2 | 18.95  | 29.00 |
| "20-9"  |        1 | 22.13  | 29.00 |
+---------+----------+--------+-------+

Каждый объект id_test в виде количества, цены и комиссии. Я хотел бы СУММИТЬ все, чтобы иметь глобальную цену: (количество * цена) + комиссия. Дело в том, и вот где я застрял, плата должна быть добавлена ​​id_test только один раз. Тем не менее, у меня есть два id_test "19-6".

Если я СУММУ все, у меня есть 1827.67 (цена * количество) + 348 (плата).

Так как у меня два "19- 6 ", мне нужно 1827,67 (цена * количество) + 319 (плата).

Как бы вы поступили в SQL?

Спасибо

Ответы [ 6 ]

1 голос
/ 18 февраля 2020

Вы можете использовать общие табличные выражения (CTE)

Предполагая, что ваши данные в таблице "data":

with total_fee as (
    select distinct id_test, fee from data
),
total_price as (
    select distinct id_test, sum(quantity) quantity, sum(price) price 
    from data
    group by id_test
)


select sum(b.price*quantity) quantity, sum(a.fee) fee
from total_fee a
left join total_price b
on a.id_test = b.id_test
0 голосов
/ 18 февраля 2020

Просто используйте агрегацию:

select sum(price * quantity) + fee
from t
group by id_test, fee;

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

select sum(price * quantity) + avg(fee)
from t
group by id_test;
0 голосов
/ 18 февраля 2020

Вы можете использовать row_number()

SELECT SUM(price*quantity) + SUM(CASE WHEN rn = 1 THEN fee END) AS RESULT
FROM   (SELECT *,ROW_NUMBER() OVER ( partition BY id_test) rn 
        FROM   test) m 

ПРОВЕРЬТЕ ДЕМО ЗДЕСЬ

ВЫХОД

Result
2146.67
0 голосов
/ 18 февраля 2020
select sum(quantity * price),
       (select sum(fee)
        from (select distinct(id_test), fee
        from sales) as fees)
from sales;

Я создал SQLFiddle для демонстрации.

0 голосов
/ 18 февраля 2020
  1. Поместите id_test, (количество * цена) и плату во временную таблицу.
WITH cte1 AS (
SELECT
    id_test,
    (quantity * price) AS total,
    fee 
FROM
table
)
Теперь добавьте сумму для каждого идентификатора
WITH cte2 AS (
SELECT SUM(total) + fee AS total_id
 FROM cte1
 GROUP BY id_test
)
Теперь найдите общую сумму
 SELECT SUM(total_id) AS SUM
 FROM cte1 
0 голосов
/ 18 февраля 2020

Только один раз по id_test означает, что вы должны пройти отдельный id_test. Если 29,00 - это фиксированное значение stati c, вы можете взять отдельный id_test и умножить его на 29.00

. Вы можете вставить значения вышеупомянутого запроса во временную таблицу (#tempTable). Тогда ваши выходные значения будут временно сохранены в таблицу

SELECT
  DISTINCT(id_test) * 29.00 AS fee
FROM
  #tempTable
...