查找工单取消总和的子查询
Sub query to find sum of work order cancels
我在工作中学习了 SQL 一点点,但我在整理这个查询时遇到了很多麻烦。这是我要回答的问题:
在取消工单的客户中(2015 年 8 月 16 日至 2015 年 7 月 12 日之间),有多少人在一周内设置了工单?
这是我现在的查询(尚未完成):
SELECT a.create_date as "date"
, COUNT(*) as "total_work_orders"
, SUM (
CASE WHEN a.status = 'X' THEN 1 ELSE 0 END
) as "total_canceled"
FROM ALL_WORK_ORDERS a
WHERE ("date" >= CAST('08-16-2015' AS DATE FORMAT 'MM-DD-YYYY'))
AND ("date" <= CAST('12-07-2015' AS DATE FORMAT 'MM-DD-YYYY'))
GROUP BY "date"
ORDER BY "date"
这会提取工作订单的总数以及已取消的总数。我在想我需要执行一个子查询,当发现工作订单 'X'(已取消)时将 运行,然后计算有多少工作订单(如果有)已被取消'O'(已打开),在取消日期的一周内。我想我还应该使用 a.completion_date 来获取初始工作订单被取消的日期。
我只是不知道如何把它们放在一起。我将不胜感激任何帮助。
谢谢。
编辑:经过进一步了解,这里有一些澄清的细节。该查询将提供每天的总数。一个例子是,如果工作订单在 10 月 08 日创建,然后在 10 月 9 日取消。但是他们在 10 月 12 日创建了一个新的工作订单。然后在输出中会有 10/08 的 +1。
我之前进行了一个查询,该查询提取了一周内取消的工作订单,我想我可以将其拆开来处理这个问题。
SELECT a.create_date as "date",
COUNT(*) AS "total_work_orders",
SUM(CASE WHEN a.create_date = a.completion_date AND a.status = 'X'
THEN 1 ELSE 0 END) AS "cancelled same day",
SUM(CASE WHEN a.create_date + INTERVAL '1' DAY = a.completion_date AND a.status = 'X'
THEN 1 ELSE 0 END) AS "cancelled next day",
SUM(CASE WHEN a.create_date + INTERVAL '2' DAY = a.completion_date AND a.status = 'X'
THEN 1 ELSE 0 END) AS "cancelled +2 Days",
SUM(CASE WHEN a.create_date + INTERVAL '3' DAY = a.completion_date AND a.status = 'X'
THEN 1 ELSE 0 END) AS "cancelled +3 Days",
SUM(CASE WHEN a.create_date + INTERVAL '4' DAY = a.completion_date AND a.status = 'X'
THEN 1 ELSE 0 END) AS "cancelled +4 Days",
SUM(CASE WHEN a.create_date + INTERVAL '5' DAY = a.completion_date AND a.status = 'X'
THEN 1 ELSE 0 END) AS "cancelled +5 Days",
SUM(CASE WHEN a.create_date + INTERVAL '6' DAY = a.completion_date AND a.status = 'X'
THEN 1 ELSE 0 END) AS "cancelled +6 Days",
SUM(CASE WHEN a.create_date + INTERVAL '7' DAY = a.completion_date AND a.status = 'X'
THEN 1 ELSE 0 END) AS "cancelled +7 Days"
FROM ALL_WORK_ORDERS a
WHERE ( a.create_date >= CAST('08-16-2015' AS DATE FORMAT 'MM-DD-YYYY'))
AND ( a.create_date <= CAST('12-07-2015' AS DATE FORMAT 'MM-DD-YYYY'))
GROUP BY "Date"
ORDER BY "Date"
我相当确定我在正确的轨道上。但我仍然认为自己是 SQL.
的早期初学者
编辑 2:我似乎无法正确描述这一点。那是我的错。这是所需输出的 table。
如果性能不是问题,这可能会对您有所帮助:
(也许你需要解决这个问题,因为我不太习惯 MS SQL)
SELECT
a.create_date AS 'date',
COUNT(*) AS 'total_work_orders',
b.counter AS '2nd wo within 7days',
c.counter AS '2nd wo 8-14 days'
FROM
ALL_WORK_ORDERS a
INNER JOIN
(SELECT
a.create_date AS 'date', COUNT(*) AS counter
FROM
ALL_WORK_ORDERS t1
WHERE
t1.completion_date BETWEEN t1.create_date + INTERVAL 1 DAY AND t1.create_date + INTERVAL 7 DAY
AND t1.status = 'X'
GROUP BY a.date) b ON a.date = b.date
INNER JOIN
(SELECT
a.create_date AS 'date', COUNT(*) AS counter
FROM
ALL_WORK_ORDERS t2
WHERE
t1.completion_date BETWEEN t2.create_date + INTERVAL 8 DAY AND t2.create_date + INTERVAL 14 DAY
AND t2.status = 'X'
GROUP BY a.date) c ON a.date = c.date
WHERE (a.date >= CAST('08-16-2015' AS DATE FORMAT 'MM-DD-YYYY'))
AND (a.date <= CAST('12-07-2015' AS DATE FORMAT 'MM-DD-YYYY'))
GROUP BY a.date
ORDER BY a.date;
我在工作中学习了 SQL 一点点,但我在整理这个查询时遇到了很多麻烦。这是我要回答的问题:
在取消工单的客户中(2015 年 8 月 16 日至 2015 年 7 月 12 日之间),有多少人在一周内设置了工单?
这是我现在的查询(尚未完成):
SELECT a.create_date as "date"
, COUNT(*) as "total_work_orders"
, SUM (
CASE WHEN a.status = 'X' THEN 1 ELSE 0 END
) as "total_canceled"
FROM ALL_WORK_ORDERS a
WHERE ("date" >= CAST('08-16-2015' AS DATE FORMAT 'MM-DD-YYYY'))
AND ("date" <= CAST('12-07-2015' AS DATE FORMAT 'MM-DD-YYYY'))
GROUP BY "date"
ORDER BY "date"
这会提取工作订单的总数以及已取消的总数。我在想我需要执行一个子查询,当发现工作订单 'X'(已取消)时将 运行,然后计算有多少工作订单(如果有)已被取消'O'(已打开),在取消日期的一周内。我想我还应该使用 a.completion_date 来获取初始工作订单被取消的日期。
我只是不知道如何把它们放在一起。我将不胜感激任何帮助。
谢谢。
编辑:经过进一步了解,这里有一些澄清的细节。该查询将提供每天的总数。一个例子是,如果工作订单在 10 月 08 日创建,然后在 10 月 9 日取消。但是他们在 10 月 12 日创建了一个新的工作订单。然后在输出中会有 10/08 的 +1。
我之前进行了一个查询,该查询提取了一周内取消的工作订单,我想我可以将其拆开来处理这个问题。
SELECT a.create_date as "date",
COUNT(*) AS "total_work_orders",
SUM(CASE WHEN a.create_date = a.completion_date AND a.status = 'X'
THEN 1 ELSE 0 END) AS "cancelled same day",
SUM(CASE WHEN a.create_date + INTERVAL '1' DAY = a.completion_date AND a.status = 'X'
THEN 1 ELSE 0 END) AS "cancelled next day",
SUM(CASE WHEN a.create_date + INTERVAL '2' DAY = a.completion_date AND a.status = 'X'
THEN 1 ELSE 0 END) AS "cancelled +2 Days",
SUM(CASE WHEN a.create_date + INTERVAL '3' DAY = a.completion_date AND a.status = 'X'
THEN 1 ELSE 0 END) AS "cancelled +3 Days",
SUM(CASE WHEN a.create_date + INTERVAL '4' DAY = a.completion_date AND a.status = 'X'
THEN 1 ELSE 0 END) AS "cancelled +4 Days",
SUM(CASE WHEN a.create_date + INTERVAL '5' DAY = a.completion_date AND a.status = 'X'
THEN 1 ELSE 0 END) AS "cancelled +5 Days",
SUM(CASE WHEN a.create_date + INTERVAL '6' DAY = a.completion_date AND a.status = 'X'
THEN 1 ELSE 0 END) AS "cancelled +6 Days",
SUM(CASE WHEN a.create_date + INTERVAL '7' DAY = a.completion_date AND a.status = 'X'
THEN 1 ELSE 0 END) AS "cancelled +7 Days"
FROM ALL_WORK_ORDERS a
WHERE ( a.create_date >= CAST('08-16-2015' AS DATE FORMAT 'MM-DD-YYYY'))
AND ( a.create_date <= CAST('12-07-2015' AS DATE FORMAT 'MM-DD-YYYY'))
GROUP BY "Date"
ORDER BY "Date"
我相当确定我在正确的轨道上。但我仍然认为自己是 SQL.
的早期初学者编辑 2:我似乎无法正确描述这一点。那是我的错。这是所需输出的 table。
如果性能不是问题,这可能会对您有所帮助:
(也许你需要解决这个问题,因为我不太习惯 MS SQL)
SELECT
a.create_date AS 'date',
COUNT(*) AS 'total_work_orders',
b.counter AS '2nd wo within 7days',
c.counter AS '2nd wo 8-14 days'
FROM
ALL_WORK_ORDERS a
INNER JOIN
(SELECT
a.create_date AS 'date', COUNT(*) AS counter
FROM
ALL_WORK_ORDERS t1
WHERE
t1.completion_date BETWEEN t1.create_date + INTERVAL 1 DAY AND t1.create_date + INTERVAL 7 DAY
AND t1.status = 'X'
GROUP BY a.date) b ON a.date = b.date
INNER JOIN
(SELECT
a.create_date AS 'date', COUNT(*) AS counter
FROM
ALL_WORK_ORDERS t2
WHERE
t1.completion_date BETWEEN t2.create_date + INTERVAL 8 DAY AND t2.create_date + INTERVAL 14 DAY
AND t2.status = 'X'
GROUP BY a.date) c ON a.date = c.date
WHERE (a.date >= CAST('08-16-2015' AS DATE FORMAT 'MM-DD-YYYY'))
AND (a.date <= CAST('12-07-2015' AS DATE FORMAT 'MM-DD-YYYY'))
GROUP BY a.date
ORDER BY a.date;