1

過去 3 か月間の毎日の「プロット」売上を示すレポートを実行しようとしていますが、SUM() を正しく合計するのに苦労しています。1 つの Transaction_ID が複数の Plot レコードにまたがる場合があります。以下のクエリでは、同じ Transaction_ID を持つ 2 つのプロットがある場合、それらが一緒に追加されますが、これは私が望むものではありません。SUM() 内でトランザクション行を 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, 
    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                   |                | 
+------------------------+-------------+------+-----+---------------------+----------------+
4

2 に答える 2

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; 
于 2012-05-21T20:51:21.920 に答える
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 

2番目に行く:

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つの行が生成され、2つの行がTransaction_ID 2を参照し、1つの行がTransaction_ID1を参照します。

これにより、3つのプロット行が表示されますが、合計値は正しく表示されます。

于 2012-05-21T11:59:02.833 に答える