2012-05-21 6 views
1

지난 3 개월 동안 매일 "음모"판매량을 제공하는 보고서를 실행하려고하는데 SUM()을 올바르게 추가하는 데 어려움을 겪고 있습니다. 단일 Transaction_ID는 여러 Plot 레코드에 걸쳐있을 수 있습니다. 아래 쿼리에서 동일한 Transaction_ID가있는 2 개의 플롯이있는 경우이를 함께 추가합니다. 이는 원하는 바가 아닙니다. SUM() 내에서 트랜잭션 행을 한 번만 사용해야합니다. SUM()에 DISTINCT 행을 어떻게 선택합니까?

SELECT 
    DATE_FORMAT(Transactions.CreateDate,'%m-%d') AS MonthAndDay, 
    DATE_FORMAT(Transactions.CreateDate,'%M, %D') AS Day, 
    SUM(Transactions.AmountTotal) AS DailySales 
FROM 
    Transactions, 
    Plots 
WHERE 
    Transactions.Transaction_ID = Plots.Transaction_ID AND 
    Transactions.CreateDate <= CURDATE() AND 
    Transactions.CreateDate >= DATE_SUB(CURDATE(),INTERVAL 3 MONTH) 
GROUP BY 
    MonthAndDay 
ORDER BY 
    MonthAndDay ASC 

테이블 구조

그래서 같이 :

+-----------------------------------+----------------------------------------------------------------------------------------------------+------+-----+---------------------+----------------+ 
| Field        | Type                        | Null | Key | Default    | Extra   | 
+-----------------------------------+----------------------------------------------------------------------------------------------------+------+-----+---------------------+----------------+ 
| Transaction_ID     | int(11)                       | NO | PRI | NULL    | auto_increment | 
| CreateDate      | datetime                       | NO |  | 0000-00-00 00:00:00 |    | 
| AmountTotal      | decimal(10,2)                      | NO |  | 0.00    |    | 
+-----------------------------------+----------------------------------------------------------------------------------------------------+------+-----+---------------------+----------------+ 

+------------------------+-------------+------+-----+---------------------+----------------+ 
| Field     | Type  | Null | Key | Default    | Extra   | 
+------------------------+-------------+------+-----+---------------------+----------------+ 
| Plot_ID    | int(11)  | NO | PRI | NULL    | auto_increment | 
| Transaction_ID   | int(11)  | YES | MUL | NULL    |    | 
| Plot     | varchar(10) | NO |  | 0     |    | 
+------------------------+-------------+------+-----+---------------------+----------------+ 
+0

당신은 Plot_ID, MonthAndDay' BY'GROUP 싶지 않아? – eggyal

+0

이렇게하면 보고서의 요점 인 MonthDay별로 그룹화가 끊어지며 Plot 레코드에 여러 번 표시되는 트랜잭션이 합산되는 문제는 해결되지 않습니다 (원래 문제의 주요 부분입니다). 전술 한 바와). – Travis

답변

1

다음 솔루션 작품 :

SELECT 
    DATE_FORMAT(Transactions.CreateDate,'%m-%d') AS MonthAndDay, 
    DATE_FORMAT(Transactions.CreateDate,'%M, %D') AS Day, 
    SUM(Transactions.AmountTotal) AS DailySales 
FROM 
    Transactions 
WHERE 
    Transactions.Transaction_ID IN (SELECT DISTINCT Transaction_ID FROM Plots) AND 
    Transactions.CreateDate <= CURDATE() AND 
    Transactions.CreateDate >= DATE_SUB(CURDATE(),INTERVAL 3 MONTH) 
GROUP BY 
    MonthAndDay 
ORDER BY 
    MonthAndDay ASC; 
0

내 머리 위로 떨어져, 나는 다음과 같은 작업 것이라고 생각하지만, 나는 그것을 테스트하지 않았습니다, 그래서 잘못 될 수 :

SELECT 
    DISTINCT Transactions.Transaction_ID, 
    DATE_FORMAT(Transactions.CreateDate,'%m-%d') AS MonthAndDay, 
    DATE_FORMAT(Transactions.CreateDate,'%M, %D') AS Day, 
    SUM(Transactions.AmountTotal) AS DailySales 
FROM 
    Transactions, 
    Plots 
WHERE 
    Transactions.Transaction_ID = Plots.Transaction_ID AND 
    Transactions.CreateDate <= CURDATE() AND 
    Transactions.CreateDate >= DATE_SUB(CURDATE(),INTERVAL 3 MONTH) 
GROUP BY 
    MonthAndDay 
ORDER BY 
    MonthAndDay ASC 

둘째로 이동 :

SELECT 
    DATE_FORMAT(Transactions.CreateDate,'%m-%d') AS MonthAndDay, 
    DATE_FORMAT(Transactions.CreateDate,'%M, %D') AS DAY, 
    SUM(Transactions.AmountTotal) AS DailySales, 
    COUNT(Transactions.Transaction_ID) AS Tmp 
FROM 
    Transactions, 
    Plots 
WHERE 
    Transactions.Transaction_ID = Plots.Transaction_ID AND 
    Transactions.CreateDate <= CURDATE() AND 
    Transactions.CreateDate >= DATE_SUB(CURDATE(),INTERVAL 3 MONTH) 
GROUP BY 
    Plots.Plot_ID, MonthAndDay 
ORDER BY 
    MonthAndDay ASC 

이것은 Plots 테이블에 3 개의 행을 생성했습니다. 두 개의 행은 Transaction_ID 2와 하나의 행 참조를 나타냅니다. Transaction_ID 1

결과적으로 세 개의 행이 나타나지만 합계 값이 올바르게 나타납니다. 하위 쿼리와이기는하지만

+0

나는 나의 예제 쿼리와 같은 숫자를 얻고있다. 내 쿼리는 일별로 그룹화되어 있습니다.이 쿼리는 영향을받지 않도록합니다. – Travis

+0

그냥 문제를 혼란스럽게합니다 ... 데이터가 선택, 그룹 또는 주문에서 실제로 사용되지 않는 경우 Plots 테이블의 용도는 무엇입니까? – Gavin

+0

트랜잭션 테이블에는 다른 유형의 트랜잭션이 있으므로 Plot 테이블은 플롯을 구입하는 데 사용 된 트랜잭션 만 포함하는 데 사용됩니다. 또한, 거래가 플롯과 다른 것을 포함하는 경우는 결코 없습니다. – Travis

관련 문제