【问题标题】:combining multiple mySQL queries with join将多个 mySQL 查询与 join 结合起来
【发布时间】:2013-11-27 23:40:04
【问题描述】:

我想将几个 mySQL 查询合并到一个结果表中。 一个例子:

+---------+--------------+--------------+
| Date    | Order number | Order status |
+---------|--------------|--------------|
| 1/1/13  | 1            | Open         |
| 1/3/13  | 1            | Confirmed    | 
| 2/1/13  | 2            | Open         |
| 2/10/13 | 2            | Confirmed    |
| 2/20/13 | 1            | Shipped      |
| 3/13/13 | 2            | Shipped      |
...

我想要一个查询给我这个结果表:

+-------+--------------+----------------+
| Month | Total orders | Shipped orders |
+-------|--------------|----------------|
| 1/13  | 1            | 0              |
| 2/13  | 2            | 1              |
| 3/13  | 1            | 1              |
+-------+--------------+----------------+

订单总数反映了其中有任何活动的订单,发货的订单是不言自明的。

我可以得到一个包含“月份”和“总订单”列的结果表:

select date_format('Date', '%c %y') as Month, count(distinct 'Order number') as Total orders from table group by Month

还有一个包含“月份”和“已发货”订单列的结果表:

select date_format('Date', '%c %y') as Month, count(distinct 'Order number') as Shipped orders from table where 'Order Status' = 'Shipped' group by Month

如何结合这 2 个选择查询来给我上面的一个表?我想我需要使用“月份”进行某种联接,但无法弄清楚。

【问题讨论】:

  • 您可以使用数据透视表。这是一个很好的教程:artfulsoftware.com/infotree/qrytip.php?id=523
  • 澄清一点。您想要的结果表明 2/13 总共有 2 个订单。数据显示本月只有一个新订单(状态 = 未结)。您是否希望 Total Orders 列记录一个月内的所有新订单或当月有活动的所有订单(即未结订单、已确认订单或已发货)?
  • 澄清一下——我希望“总订单”列记录当月有活动的所有订单(即未结、已确认或已发货)。

标签: mysql join


【解决方案1】:

这里是SQLFIDDLEdemo

SELECT 
B.MONTH_YEAR, B.ORDER_CNTS, C.SHIPPED_ORDERS
FROM
(
SELECT MONTH_YEAR , COUNT(ORDERNO) AS ORDER_CNTS
FROM
(
SELECT DISTINCT CONCAT(CAST(MONTH(B.O_DATE) AS CHAR), '/', CAST(YEAR(B.O_DATE)  AS CHAR)) AS MONTH_YEAR , (ORDERNO) AS ORDERNO 
FROM SAMPLE AS B
)
 B
GROUP BY MONTH_YEAR
) AS B
,
(
SELECT MONTH_YEAR , SUM(SHIPPED_ORDERS )AS SHIPPED_ORDERS
FROM
(
SELECT DISTINCT CONCAT(CAST(MONTH(B.O_DATE) AS CHAR), '/', CAST(YEAR(B.O_DATE)  AS CHAR)) AS MONTH_YEAR ,
  (CASE WHEN ORDER_STATUS= "Shipped" THEN 1 ELSE 0 END) AS SHIPPED_ORDERS
FROM SAMPLE AS B
)
 B
GROUP BY MONTH_YEAR
) AS C
WHERE B.MONTH_YEAR = C.MONTH_YEAR

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-08
    • 2020-11-04
    • 1970-01-01
    • 2011-12-10
    • 2020-12-24
    • 1970-01-01
    相关资源
    最近更新 更多