按年添加两列金额

时间:2013-01-18 16:35:19

标签: mysql

以下是我的查询,将我的客户组合在一起,并总结他们在过去两年中花费的总金额。奇迹般有效。但是我需要更多的东西来解释我的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

1 个答案:

答案 0 :(得分: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 

<强>结果

| CUSTOMER_ID | 2010_MONEY_PAID | 2011_MONEY_PAID | 2012_MONEY_PAID | FIRST_NAME | LAST_NAME | EMAIL_PRIMARY | PHONE_PRIMARY |
------------------------------------------------------------------------------------------------------------------------------
|           1 |            9000 |            3000 |            2000 |        Bob |     Smith | bob@smith.com |    1112223333 |
|           2 |            4000 |            5000 |            1000 |        Tom |     Jones | tom@jones.com |    2223334444 |

See the demo