Mysql 连接表-有点复杂
每周,我的客户都会通过第三方营销团队进行广播和电子邮件宣传,以推广他的产品。他想知道自己每周挣多少钱/花多少钱,并将数据细分。表数据如下所示:Mysql 连接表-有点复杂,mysql,join,group-by,Mysql,Join,Group By,每周,我的客户都会通过第三方营销团队进行广播和电子邮件宣传,以推广他的产品。他想知道自己每周挣多少钱/花多少钱,并将数据细分。表数据如下所示: tablename: orders +----------+--------------+---------------------+------------+ | order_id | order_amount | referral | order_date | +----------+--------------+-------
tablename: orders
+----------+--------------+---------------------+------------+
| order_id | order_amount | referral | order_date |
+----------+--------------+---------------------+------------+
| 1 | 16.00 | Radio: Jack Johnson | 2013-07-01 |
| 2 | 50.00 | Radio: Jack Johnson | 2013-07-02 |
| 3 | 16.00 | Radio: Jack Johnson | 2013-07-02 |
| 4 | 50.00 | Radio: Thabo Mbeki | 2013-07-03 |
| 5 | 16.00 | Email: Renewal | 2013-07-08 |
| 6 | 50.00 | Other | 2013-07-08 |
| 7 | 16.00 | Email: Renewal | 2013-07-08 |
| 8 | 50.00 | Radio: Thabo Mbeki | 2013-07-09 |
+----------+--------------+--------------+-------------------+
tablename: media
+----------+-------+-------+--------------+-------+------------+
| media_id | spots | cost | name | type | date |
+----------+-------+-------+--------------+-------+------------+
| 1 | 10 | 10000 | Jack Johnson | radio | 2013-07-01 |
| 2 | 5 | 5000 | Thabo Mbeki | radio | 2013-07-01 |
| 3 | 10 | 10000 | Jack Johnson | radio | 2013-07-08 |
| 4 | 5 | 5000 | Thabo Mbeki | radio | 2013-07-08 |
| 5 | 1 | 250 | Renewal | email | 2013-07-08 |
+----------+---------------+--------------+--------------------+
+------------+--------------+-------+------+----------+---------+--------------+----------------+
| week | name | type |spots | cost | revenue | total orders | avg. per order |
+------------+--------------+-------+------+----------+---------+--------------+----------------+
| 2013-07-01 | Jack Johnson | radio | 10 | 10000 | 82.00 | 3 | 27.33 |
| 2013-07-01 | Thabo Mbeki | radio | 5 | 5000 | 50.00 | 1 | 50.00 |
+------------+--------------+-------+------+----------+---------+--------------+----------------+
我需要生成如下所示的HTML表:
tablename: orders
+----------+--------------+---------------------+------------+
| order_id | order_amount | referral | order_date |
+----------+--------------+---------------------+------------+
| 1 | 16.00 | Radio: Jack Johnson | 2013-07-01 |
| 2 | 50.00 | Radio: Jack Johnson | 2013-07-02 |
| 3 | 16.00 | Radio: Jack Johnson | 2013-07-02 |
| 4 | 50.00 | Radio: Thabo Mbeki | 2013-07-03 |
| 5 | 16.00 | Email: Renewal | 2013-07-08 |
| 6 | 50.00 | Other | 2013-07-08 |
| 7 | 16.00 | Email: Renewal | 2013-07-08 |
| 8 | 50.00 | Radio: Thabo Mbeki | 2013-07-09 |
+----------+--------------+--------------+-------------------+
tablename: media
+----------+-------+-------+--------------+-------+------------+
| media_id | spots | cost | name | type | date |
+----------+-------+-------+--------------+-------+------------+
| 1 | 10 | 10000 | Jack Johnson | radio | 2013-07-01 |
| 2 | 5 | 5000 | Thabo Mbeki | radio | 2013-07-01 |
| 3 | 10 | 10000 | Jack Johnson | radio | 2013-07-08 |
| 4 | 5 | 5000 | Thabo Mbeki | radio | 2013-07-08 |
| 5 | 1 | 250 | Renewal | email | 2013-07-08 |
+----------+---------------+--------------+--------------------+
+------------+--------------+-------+------+----------+---------+--------------+----------------+
| week | name | type |spots | cost | revenue | total orders | avg. per order |
+------------+--------------+-------+------+----------+---------+--------------+----------------+
| 2013-07-01 | Jack Johnson | radio | 10 | 10000 | 82.00 | 3 | 27.33 |
| 2013-07-01 | Thabo Mbeki | radio | 5 | 5000 | 50.00 | 1 | 50.00 |
+------------+--------------+-------+------+----------+---------+--------------+----------------+
对于我来说,我试图弄清楚如何连接表,并根据订单中的引用字段对它们进行分组,这变得很复杂。由于orders.reference与media.name不匹配,我猜有一个WHERE引用,如%name,但我不确定如何执行该操作。如果忽略其他,则最好使用join WHERE子句
WHERE orders.order_date = media.date
AND LOWER(orders.referral) = LOWER(media.type + ": " + media.name)
这是Sybase语法,如果您需要对MySQL进行一些调整,我很抱歉
要处理其他问题,只需对媒体表进行外部连接
类似“未检查正确性”的内容将按日期生成报告;如果你愿意的话,你需要每周对小组进行进一步的按摩。这并不难,但我觉得这超出了你问题的主要范围
SELECT SUM(order.amount) AS revenue, COUNT(order.amount) as total_orders
,SUM(order.amount)/COUNT(order.amount) as average_order
,SUM(spots) spots, media.type, media.name, order_date
FROM order
LEFT OUTER JOIN media
ON orders.order_date = media.date
AND LOWER(orders.referral) = LOWER(media.type + ": " + media.name)
GROUP BY order.referral, order.date
-- May be add to group by: , COALESCE(media.type,media.name,"Other")
我认为这应该是可行的:
SELECT m.name, [other needed columns]
FROM media m JOIN orders o ON o.referral LIKE '%' + m.name +'%'
WHERE m.date between [date] and [date]
GROUP BY m.name, [other groupings]
希望这有帮助 这里帮了大忙。这是我最后使用的查询:
SELECT m.date, m.name, m.type, m.spots, m.cost,
SUM(o.order_amount) as revenue,
COUNT(o.order_amount) as orders,
SUM(o.order_amount)/COUNT(o.order_amount) as average_order
FROM media m
JOIN orders o
ON LOWER(o.referral) = CONCAT(LOWER(m.type), ': ' ,LOWER(m.name))
WHERE (DATE(o.order_date) BETWEEN '2013-06-24' AND '2013-06-30')
GROUP BY m.name, m.type
您是否可以选择修复表以将引用分为两列?是的,数据需要清理。他们有这么多的命名约定,我永远不会给他们想要看到的准确报告。我正在为所有表实现一个适当的命名方案,这将在查询和结果中产生巨大的差异。我的意思是,orders表中的列和media表中的列具有相同的单独名称和类型。加入将更容易是的,我理解,这将使事情变得更容易。使用下面的解决方案,我能够使用CONCAT将“类型”和“名称”组合起来,以重新创建“引用”。但是在orders表中将它们分成两个字段就不需要这样做了。这非常有帮助!谢谢你把它放在一起。谢谢你把金额加起来,然后再计算我无法直接思考的金额。这是一个伟大的步骤。我现在也知道,如果他们想要好的匹配,数据需要清理。