2011-01-26 9 views
0

나는 일별, 주별, 월별 및 연도별 주문 수와 해당 시간대 간의 주문 합계를 출력하려고합니다. 지금 나는 다음을 생각해 냈습니다. 그 긴,하지만 같은 진술의 단지 복사 및 붙여 넣기 직업은 년, 월, 주 및 일까지 그룹으로 약간 수정했습니다. 따라서, 출력 할 수있다 연, 월, 주, 일 카운트 및 거래 금액을 제공하는 이상적인 출력행 당 날짜 범위 그룹화

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) 

. 그러나 이것은 한 가지 유형의 주문에만 해당됩니다. orders 테이블에는 온라인과 터미널의 두 가지 유형의 주문이 있으며, 이상적으로는 데이터베이스에 여러 번 쿼리하는 대신 동일한 쿼리에서 두 유형을 모두 출력하고 싶습니다.

문제가있는 두 가지 질문이 있습니다. 첫째, 동일한 결과를 얻는 더 간단한 방법이 있습니까? 두 번째 질문으로 이어지기 때문에 나는 그것을 복잡하게하고 싶지 않습니다. 왜냐하면 어떤 주문은 다르기 때문에 온라인 주문과 터미널 주문을 모두 보여주기를 원합니다. 제가 이미 가지고있는 코드를 복사하고 UNION으로 추가하면 ' WHERE Terminal = 1 '이므로 결과는 같습니다. 동일한 쿼리에서 두 세트의 출력을 출력하는 방법이 있습니까?

나는 아마도 내가 지향하는 것을 복잡하게 만들지 만 사전에 조언이나 조언을 해주셔서 감사드립니다. 내가 다른를 제공하기 위해 선택하는 이유

답변

0

당신은 그건 꽤 큰 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 | 
+------+---------+------------+-------------+ 

될 것 GROUP BY WITH ROLLUP

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

결과를 사용하여이 예와 같이 시도 할 수 있습니다 예!