2011-01-26 6 views
0

私は、毎日、毎週、毎月、および数えられた注文の数と、それらの期間の間の注文の合計金額を出力しようとしています。現時点で私は次のことを思いついた。その長いですが、同じ声明のちょうどコピー&ペーストの仕事はちょうど年、月、週と日までにグループ化するためにわずかに修正されました。それに応じて出力することができる年、月、週、毎日数および取引合計を提供する理想的な出力である1行あたりの日付範囲のグループ化

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 

を出力

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) 

。しかし、それは1つのタイプの注文に対するものです。 ordersテーブルには、オンラインと端末の2種類の注文があり、理想的にはデータベースを複数回クエリする代わりに両方のタイプを同じクエリで出力したいと思っています。

私に問題がある2つの質問があります。まず、同じ結果を達成するための簡単な方法がありますか?いくつかの注文が異なるため、2番目の質問につながるので、私はそれを複雑にしたくないです。私は単に私が既に持っているコードをコピーしてUNIONに加えれば、オンライン注文と端末注文の両方を表示することができます。 WHERE Terminal = 1 'のため、結果は同じです。同じクエリで2組の出力を出力する方法はありますか?

私はおそらく、私が目指していることを複雑にしていますが、事前にアドバイスや指摘をいただきありがとうございます。

答えて

0

あなたはROLLUP

あなたのクエリは、私は別のものを与えることを選択した理由ですかなり大きいとGROUP BY WITH ROLLUP

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

結果がRerenceについては

+------+---------+------------+-------------+ 
| 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 | 
+------+---------+------------+-------------+ 

になります使用して、この例のように試すことができます例!

関連する問題