sql запрос для расчета суммы продажи с условием способа оплаты - PullRequest
1 голос
/ 27 июня 2019

Я хочу получить отчет о сумме дневных продаж с условием

Способ оплаты, например, наличными или картой, должен быть группирован как одна строка, а другой платеж - как новая строка

CREATE TABLE IF NOT EXISTS `sale` (
  `ID` int(6) unsigned NOT NULL,
  `payment_method` int(3) unsigned NOT NULL,
  `amount` varchar(200) NOT NULL,
  `qty` varchar(200) NOT NULL,
 )

INSERT INTO `sale` (`id`, `payment_method`, `amount`,  `qty `) VALUES

  ('2', '200', '10050','1'),
  ('3', '201', '10050','1'),
  ('4', '200', '9045','1'),
  ('6', '227', '10050','1'),
  ('8', '228', '20050','2')

select   payment_method,sum( amount),
sum(qty) from sale
group by payment_method

Я знаю, что если я сгруппируюсь по методу оплаты, то для каждого метода оплаты будет строка, но я не знаю, как добавить или сгруппировать метод оплаты 200 и 201 как 1 метод.

Пожалуйста, помогите мне добавить продажу этого 2 платежа как один тип.

Мой ожидаемый выход ниже

amount  qty document_Total_amount 
29145    3  59295     
30150    3  59295

Ответы [ 6 ]

2 голосов
/ 27 июня 2019

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

select (case when payment_method in (200, 201) then 'cash' else 'credit' end),  -- or whatever values are appropriate
       sum( amount),
       sum(qty)
from sale
group by (case when payment_method in (200, 201) then 'cash' else 'credit' end);

Обратите внимание, что вы не включаете первый столбец в свои результаты, хотя я думаю, что он должен быть там.Вы можете удалить первое выражение в select, если оно вам не нужно.

На практике, однако, вы должны иметь справочную таблицу payment_methods и использовать join:

select pm.grouping,
       sum(s.amount),
       sum(s.qty)
from sale s join
     payment_methods pm
     on s.payment_method = pm.payment_method
group by pm.grouping;

Заказная логика, такая как сходство разных способов оплаты, должна храниться в справочной таблице, а не повторяться в разных запросах.Последний является техническим кошмаром.

1 голос
/ 27 июня 2019

Используйте этот запрос ниже, чтобы получить разницу от способа оплаты, которого вы легко можете достичь.

select sum(cast(amount as int)),sum(cast(qty as int)),pmcalc 
from 
   (select id,payment_method,amount,qty,payment_method/10 as pmcalc from sale) r
group by pmcalc
1 голос
/ 27 июня 2019
SELECT COUNT(*),SUM(cast(t.amount as INT)) 
FROM (
    SELECT *,CASE WHEN [sale].payment_method in (200,201) THEN 1 ELSE 2 END Pt
FROM [sale]) t
GROUP BY t.Pt
1 голос
/ 27 июня 2019

Следующий запрос даст вам желаемый результат -

 ;With cte (payment_method, amount, qty, category)as
 (
    select payment_method, amount,qty,
    case when payment_method in (200, 201) then 'cash&card' else 'Other' end as Category
    From sale
)
select Category, 
Sum(amount) Amount, Sum(qty) Quantity 
from cte 
group by category 
1 голос
/ 27 июня 2019
  select sum(amount),sum(qty) from sale
  where payment_method in (200,201)

  union all 

  select sum(amount),sum(qty) from sale
  where payment_method not in (200,201)
1 голос
/ 27 июня 2019

Вам следует рассмотреть возможность изменения типов данных Сумма & Кол-во на Numeric & INT соответственно. Следующий запрос должен делать то, что вы хотите

SELECT SUM([amount]) AS [Amount], SUM([qty]) AS [Qty] FROM [sale]
CROSS APPLY (VALUES(CASE WHEN [payment_method] IN (200,201) THEN 'Method1' ELSE 'Other' END)) AS T(T1)
GROUP BY T1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...