0

下面是我的查询,将我的客户分组在一起,并总结了他们在过去两年中花费的总金额。奇迹般有效。但是我需要更多的东西来了解我的 sql 知识。

有没有办法再选择三列并用他们在每一年(2010、2011、2012)花费的钱填充它?

SELECT  SUM(price) AS money_spent_total, co.customer_id, cu.first_name, cu.last_name, cu.email_primary, cu.phone_primary, co.date_paid
FROM customer_order   AS co
INNER  JOIN customer AS cu ON (cu.customer_id = co.customer_id) 
WHERE  cu.customer_id != 32518 AND co.date_paid > "2010-1-1" AND co.date_paid < "2013-1-1"
GROUP BY co.customer_id
4

1 回答 1

2

你需要GROUP BY YEAR(date_paid)除了customer_id. 您也不应该选择任何不在您的GROUP BY. 此外,您可以使用BETWEEN运算符代替><作为您的日期范围。

SELECT Year(co.date_paid), 
       co.customer_id, 
       Sum(price) AS money_spent_total 
FROM   customer_order AS co 
       INNER JOIN customer AS cu 
               ON ( cu.customer_id = co.customer_id ) 
WHERE  cu.customer_id != 32518 
       AND co.date_paid BETWEEN '2010-01-01' AND '2013-01-01' 
GROUP  BY Year(co.date_paid), 
          co.customer_id 

要获取原始中的列SELECT,您可以执行以下操作(未测试):

SELECT a.date_year_paid, 
       a.customer_id, 
       a.money_spent_total, 
       cu.first_name, 
       cu.last_name, 
       cu.email_primary, 
       cu.phone_primary 
FROM   (SELECT Year(co.date_paid) AS date_year_paid, 
               co.customer_id, 
               Sum(price)         AS money_spent_total 
        FROM   customer_order AS co 
               INNER JOIN customer AS cu 
                       ON ( cu.customer_id = co.customer_id ) 
        WHERE  cu.customer_id != 32518 
               AND co.date_paid BETWEEN '2010-01-01' AND '2013-01-01' 
        GROUP  BY Year(co.date_paid), 
                  co.customer_id) a 
       LEFT JOIN customer cu 
              ON cu.customer_id = a.customer_id 

如果您INNER JOIN只是为了客户信息而做的,那么它可以被删除。

  SELECT a.customer_id, 
       a.date_year_paid, 
       a.money_spent_total, 
       cu.first_name, 
       cu.last_name, 
       cu.email_primary, 
       cu.phone_primary 
  FROM (SELECT customer_id, YEAR(date_paid) AS date_year_paid, SUM(price) AS money_spent_total
        FROM customer_order
        GROUP BY customer_id, YEAR(date_paid)) a
       LEFT JOIN customer cu 
              ON cu.customer_id = a.customer_id

最后,如果要将年份分组为列:

SELECT a.customer_id, 
       a.y2010 AS '2010_money_paid', 
       a.y2011 AS '2011_money_paid', 
       a.y2012 AS '2012_money_paid', 
       cu.first_name, 
       cu.last_name, 
       cu.email_primary, 
       cu.phone_primary 
FROM   (SELECT customer_id, 
               Sum(CASE 
                     WHEN Year(date_paid) = 2010 THEN price 
                     ELSE 0 
                   end) AS 'y2010', 
               Sum(CASE 
                     WHEN Year(date_paid) = 2011 THEN price 
                     ELSE 0 
                   end) AS 'y2011', 
               Sum(CASE 
                     WHEN Year(date_paid) = 2012 THEN price 
                     ELSE 0 
                   end) AS 'y2012' 
        FROM   customer_order 
        GROUP  BY customer_id) a 
       LEFT JOIN customer cu 
              ON cu.customer_id = a.customer_id 

结果

| 客户 ID | 2010_MONEY_PAID | 2011_MONEY_PAID | 2012_MONEY_PAID | FIRST_NAME | LAST_NAME | EMAIL_PRIMARY | PHONE_PRIMARY |
-------------------------------------------------- -------------------------------------------------- --------------------------
| 1 | 9000 | 3000 | 2000 | 鲍勃 | 史密斯 | bob@smith.com | 1112223333 |
| 2 | 4000 | 5000 | 1000 | 汤姆 | 琼斯 | 汤姆@jones.com | 2223334444 |

查看演示

于 2013-01-18T16:36:50.203 回答