【问题标题】:How to make a few columns?如何制作几列?
【发布时间】:2018-09-08 21:05:09
【问题描述】:

我需要在几列中显示结果?

样本数据

payments
user_id     amount     payment_time   sale_type
1           20          31.01.2011     card
1           10          02.01.2012     cash
3           10          03.01.2012     card
4           15          05.02.2012     bank

我需要结果:

diapason     total_amount    card     cash     bank
0-10              10     
10 and more       10     

真实查询

select IFnull(t.diapason,'total') as diapason, t.total_amount as 
total_amount, t.cash, t.bank 
FROM 
(SELECT CASE
when p2.amount<=10 then '0-10'
when p2.amount>10 then '10 +' END AS diapason, 
sum(p1.amount) as total_amount,
SUM(CASE WHEN p1.sale_type='cash' THEN p1.amount ELSE 0 END) as cash,
SUM(CASE WHEN p1.sale_type='bank' THEN p1.amount ELSE 0 END) as bank
FROM 
(SELECT distinct user_id, SUM(amount) AS amount, sale_type FROM payments 
where payment_time between '2018-04-12' and '2018-04-18' group by user_id) 
p1 
inner JOIN 
(SELECT DISTINCT user_id, sum(amount) AS amount FROM payments group by 
user_id) p2 
on p1.user_id = p2.user_id 
GROUP BY diapason WITH ROLLUP) t;

这是真正的查询,但给出了错误的结果

【问题讨论】:

  • 这是预期的结果?两个范围的总金额 = 10,卡、现金和银行没有值? (顺便说一句:我想你的意思是“超过 10”,而不是“10 或更多”。或者你想在两个范围内都包含值 10?)

标签: mysql sql database join select


【解决方案1】:

你可以试试这个。

我想你正在寻找条件聚合函数

架构 (MySQL v5.7)

CREATE TABLE payments(
  user_id INT,
  amount INT,
  payment_time DATE,
  sale_type VARCHAR(50)
);

     INSERT INTO payments VALUES (1,20,'2011-01-31','card');
     INSERT INTO payments VALUES (1,10,'2012-01-02','cash');
     INSERT INTO payments VALUES (3,10,'2012-01-03','card');
     INSERT INTO payments VALUES (4,15,'2012-02-05','bank');

查询 #1

select (case when p2.amount <=10 then '0-10'
    else '10 and more' end) diapason,
       sum(p1.amount) total_amount,
       SUM(CASE WHEN p1.sale_type='card' THEN p1.amount ELSE 0 END) card,
       SUM(CASE WHEN p1.sale_type='cash' THEN p1.amount ELSE 0 END) cash,
       SUM(CASE WHEN p1.sale_type='bank' THEN p1.amount ELSE 0 END) bank
from 
(
  select *
  from payments
  where payment_time between '2012-01-01' and '2012-01-30' group by user_id, sale_type 
) p1
join (select user_id, sum(amount) amount
  from payments
  group by user_id) p2
on p1.user_id = p2.user_id
GROUP BY (case when p2.amount <=10 then '0-10'
    else '10 and more' end);

| diapason    | total_amount | card | cash | bank |
| ----------- | ------------ | ---- | ---- | ---- |
| 0-10        | 10           | 10   | 0    | 0    |
| 10 and more | 10           | 0    | 10   | 0    |

View on DB Fiddle

【讨论】:

  • 谢谢。说明为什么在语句“SUM(CASE WHEN p1.sale_type='bank' THEN p1.amount ELSE 0 END) bank”中写“THEN p1.amount”?在我的真实数据库中,我认为,它会导致错误的结果
  • 您期望的结果和查询逻辑是什么?因为我看到你的期望结果是空的
  • 或者你期望的结果你只需要做db-fiddle.com/f/7YGnzES4s9JGQcJ9WthgxH/1
  • 我更新了有问题的查询。敬请期待。为什么它计算现金和银行错误?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-12-18
  • 1970-01-01
  • 2019-12-29
  • 2019-03-13
  • 2021-10-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多