【问题标题】:Select information from last item and join to the total amount从最后一项中选择信息并加入总金额
【发布时间】:2013-02-19 15:43:04
【问题描述】:

假设我有这样一张桌子:

标识 |日期 |客户 |出售

并且想为每个客户选择:

  • 购买次数
  • 最后一次购买价值
  • 购买的总金额,当它具有正值时

有了这个表定义:

CREATE TABLE sales (
    id int auto_increment primary key, 
    dates date,
    customer int,
    sale int
);

还有这个数据:

INSERT INTO sales
    (dates, customer, sale)
VALUES
    ('2012-01-01', 1, 2),
    ('2012-02-01', 1, 8),
    ('2012-03-01', 2, 1),
    ('2012-04-01', 2, 7),
    ('2012-05-01', 2, -5),
    ('2012-06-01', 1, 5)

我的结果应该是:

客户 |销售 |最后销售 1 3 5 2 3 7

我不知道如何获得它。我已经达到了:

SELECT s.customer, COUNT(s.sale) total_sales, last_sale FROM sales AS s
JOIN
  (SELECT customer, sale last_sale FROM sales GROUP BY customer ORDER BY dates DESC) AS t
  ON t.customer=s.customer
GROUP BY s.customer

但它不起作用。关于如何获取这些数据的任何想法?

所有代码都在SQL fiddle

【问题讨论】:

  • 你能根据fiddle的数据显示你想要的结果吗?
  • 当然,@JW,我已经编辑了我的帖子以正确显示它。它在这里,但不是很清楚。

标签: mysql sql select join


【解决方案1】:

试试这个

SELECT a.customer, count(a.sale), max_sale
FROM sales a
INNER JOIN (SELECT customer, sale max_sale 
            from sales x where dates = (select max(dates) 
                                        from sales y 
                                        where x.customer = y.customer
                                        and y.sale > 0
                                       )

           )b
ON a.customer = b.customer
GROUP BY a.customer, max_sale;

SQL DEMO

【讨论】:

  • 你好。假设销售表是巨大的(确实如此)。使用子查询而不是联接来执行此查询会更快吗?另外:我怎样才能得到更新的,然后是新的?谢谢!!
【解决方案2】:
SELECT a.customer, 
       COUNT(a.sale) total_sales,
       c.sale
FROM   sales a
       INNER JOIN
        (
          SELECT  a.*
          FROM    sales a
                  INNER JOIN
                  (
                    SELECT  Customer, MAX(Dates) max_date
                    FROM    sales
                    WHERE   sale > 0
                    GROUP   BY Customer
                  ) b ON a.customer = b.customer AND
                          a.dates = b.max_date
        ) c ON a.customer = c.customer
GROUP  BY a.customer, c.sale

【讨论】:

  • 两个答案都很棒,非常感谢!我将另一个标记为“好”,因为这是我尝试的第一个。
猜你喜欢
  • 2020-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-25
  • 2022-01-25
  • 2021-11-17
  • 2014-08-31
  • 2017-12-19
相关资源
最近更新 更多