2011-01-26 7 views
0

Я пытаюсь вывести ежедневные, еженедельные, ежемесячные и летние заказы и сумму этих заказов между этими временными диапазонами. На данный момент я придумал следующее. Его длинный, но его просто экземпляр и вставка работы того же самого заявления были слегка изменены для группировки по году, месяцу, неделе и день.Группировка диапазонов дат за строку

SELECT YEAR(s.LastUpdated) AS 'Year', 0 AS 'Month', 0 AS 'Week', 0 AS 'Day', count(rowId) AS 'Transactions', ROUND(SUM(Amount),2) AS 'Partner Cut' 
FROM gfw_orders AS o 
JOIN gfw_sage_orders AS s 
ON o.sageRef = s.VendorTxCode 
WHERE YEAR(s.LastUpdated) = 2011 
GROUP BY 
YEAR(s.LastUpdated) 
    UNION 
SELECT YEAR(s.LastUpdated) AS 'Year', MONTHNAME(s.LastUpdated) AS 'Month', 0 AS 'Week', 0 AS 'Day', count(rowId) AS 'Transactions', ROUND(SUM(Amount),2) AS 'Partner Cut' 
FROM gfw_orders AS o 
JOIN gfw_sage_orders AS s 
ON o.sageRef = s.VendorTxCode 
WHERE MONTH(s.LastUpdated) = 1 
GROUP BY 
YEAR(s.LastUpdated), MONTH(s.LastUpdated) 
    UNION 
SELECT YEAR(s.LastUpdated) AS 'Year', MONTHNAME(s.LastUpdated) AS 'Month', WEEKOFYEAR(s.LastUpdated) AS 'Week', 0 AS 'Day', count(rowId) AS 'Transactions', ROUND(SUM(Amount),2) AS 'Partner Cut' 
FROM gfw_orders AS o 
JOIN gfw_sage_orders AS s 
ON o.sageRef = s.VendorTxCode 
WHERE WEEK(s.lastUpdated) = 4 
GROUP BY 
YEAR(s.LastUpdated), MONTH(s.LastUpdated), WEEK(s.LastUpdated) 
    UNION 
SELECT YEAR(s.LastUpdated) AS 'Year', MONTHNAME(s.LastUpdated) AS 'Month', WEEKOFYEAR(s.LastUpdated) AS 'Week', DAY(s.lastUpdated), count(rowId) AS 'Transactions', ROUND(SUM(Amount),2) AS 'Partner Cut' 
FROM gfw_orders AS o 
JOIN gfw_sage_orders AS s 
ON o.sageRef = s.VendorTxCode 
WHERE DAY(s.LastUpdated) = 26 
GROUP BY 
YEAR(s.LastUpdated), MONTH(s.LastUpdated), WEEK(s.LastUpdated), DAY(s.LastUpdated) 

Каких выходы

Year  Month  Week Day Count Amount 
2011 0    0  0  3  285.00 
2011 January  0  0  3  285.00 
2011 January  4  0  2  190.00 
2011 January  4  26  1  95.00 

который является идеальным выходом обеспечивая год, месяц, неделю, ежедневно счетов и сделки сумму, которая может быть выдана соответствующим образом. Однако это только для одного типа порядка. В таблице заказов есть два типа заказов: онлайн и терминал, и в идеале я хотел бы выводить оба типа в один и тот же запрос, а не запрашивать базу данных несколько раз.

У меня есть два вопроса, с которыми у меня возникают проблемы. Во-первых, есть ли более простой способ добиться того же результата? Я не хочу усложнять его, потому что ведущий на второй вопрос, потому что некоторые заказы отличаются, и я хотел бы, чтобы результат показывал как онлайн-заказы, так и заказы на терминал, если я просто копирую и UNION код, который у меня уже есть, WHERE Terminal = 1 'из-за объединения результаты одинаковы. Есть ли способ вывода двух наборов выходов в одном запросе?

Я, вероятно, слишком усложняю то, к чему я стремился, но заблаговременно за любые советы или указатели.

ответ

0

вы можете попробовать как в этом примере с помощью GROUP BY WITH ROLLUP

mysql> SELECT year, country, product, SUM(profit) 
    -> FROM sales 
    -> GROUP BY year, country, product WITH ROLLUP; 

Результат будет

+------+---------+------------+-------------+ 
| year | country | product | SUM(profit) | 
+------+---------+------------+-------------+ 
| 2000 | Finland | Computer |  1500 | 
| 2000 | Finland | Phone  |   100 | 
| 2000 | Finland | NULL  |  1600 | 
| 2000 | India | Calculator |   150 | 
| 2000 | India | Computer |  1200 | 
| 2000 | India | NULL  |  1350 | 
| 2000 | USA  | Calculator |   75 | 
| 2000 | USA  | Computer |  1500 | 
| 2000 | USA  | NULL  |  1575 | 
| 2000 | NULL | NULL  |  4525 | 
| 2001 | Finland | Phone  |   10 | 
| 2001 | Finland | NULL  |   10 | 
| 2001 | USA  | Calculator |   50 | 
| 2001 | USA  | Computer |  2700 | 
| 2001 | USA  | TV   |   250 | 
| 2001 | USA  | NULL  |  3000 | 
| 2001 | NULL | NULL  |  3010 | 
| NULL | NULL | NULL  |  7535 | 
+------+---------+------------+-------------+ 

Для Rerence с ROLLUP

Ваш запрос является довольно большой, поэтому я выбираю, чтобы дать другим пример!

Смежные вопросы