2011-11-12 54 views
1

我試圖選擇歷史總計(t1.date - 1現在)關閉一定範圍的給定日期(t1.DATE> ='2011-01-01'和t1.DATE < = '2011-11-11')MYSQL自加入以選擇去年的銷售

SELECT 
t1.date as DATE, SUM(t1.total), t2.date, sum(t2.total) 
FROM T_SALES t1 

LEFT OUTER JOIN T_SALES t2 
on (t2.date = (t1.date - 1) 
AND t2.rc = t1.rc 
AND t2.storenum = t1.storenum) 
WHERE 
    t1.RC = 0 
AND t1.STORENUM = '1,' 
AND t1.DATE >= '2011-01-01' 
AND t1.DATE <= '2011-11-11' 
GROUP BY t1.date 

ORDER BY t1.DATE ASC 

我的第二個總t2.total是我的問題是 - SUM(t1.total)表示準確的銷售總額)

下面是我的輸出

enter image description here

值27.90,應該是5.58 - 看起來我超過總和(t2.total)。

分組由t1.total表明還有:(5.58 * 5 = 27.90)

enter image description here

我已經試過所有可以想象的分組,但只是無法得到它的權利,任何想法在那裏?謝謝大家!

+0

您試圖獲得基於日期範圍的歷史總計?我不明白你爲什麼要加入表格來做到這一點?我認爲你需要提供更多關於你想要實現的細節,或者我的預感是你試圖在一個查詢中做得太多。我不明白爲什麼要用t1.Date = t2.Date來加入表格本身。什麼是rc字段?可能你想使用嵌套的select查詢,然後在日期中將它們連接在一起。 – gdbj

+0

這很清楚(對我來說)OP正在試圖比較日常銷售,這是零售業中一個相當常見的指標。 –

+0

我認爲格雷戈裏提出了一個很好的觀點。加入一個表本身有點令人困惑,但是如果你想比較日期,你仍然可以通過使用子查詢來在where子句中這樣做,那麼你將永遠不需要再使用連接語句。 –

回答

2

你的問題是,你得到的兩個表之間的半笛卡爾乘積 - 在T1表中的兩個銷售及T2三個表的銷售額將在預彙總結果集生產六行。

有兩種方法來解決這個問題:

  1. 總表第一再加入彙總表一起。

  2. 將整個查詢基於第一個表上的簡單選擇並在結果中嵌套查詢以獲得第二個查詢。

這裏的溶液1(注意,這是由RC分解(地區代碼)和storenum,如果這不是你想要的簡單刪除這些列的所有引用):

CREATE VIEW DailyTotals (RC, StoreNum, Date, TotalAmount) AS 
SELECT RC, StoreNum, Date, SUM(Total) FROM T_Sales 
GROUP BY RC, StoreNum, Date 

SELECT TODAY.RC, TODAY.StoreNum, TODAY.Date, TODAY.TotalAmount, 
     YDAY.Date, YDAY.TotalAmount 
FROM DailyTotals TODAY 
    LEFT OUTER JOIN DailyTotals YDAY ON YDAY.Date = TODAY.Date-1 
WHERE TODAY.Date BETWEEN '2011-01-01' AND '2011-11-11' 

和這裏的解決方案2(再次與地區和商店的故障,可以刪除):

SELECT RC, StoreNum, Date, SUM(Total), Date-1, 
    (SELECT SUM(Total) FROM T_Sales YDAY WHERE 
    YDAY.RC = TODAY.RC AND YDAY.StoreNum = TODAY.StoreNum AND YDAY.Date = TODAY.Date-1) 
    FROM T_Sales TODAY WHERE Date BETWEEN '2011-01-01' AND '2011-11-11' 
0

嘗試修改您的查詢弄成這個樣子:

SELECT 
t1.date as DATE, SUM(t1.total), t1.date, sum(t1.total) 
FROM T_SALES t1 
WHERE 
    t1.RC = 0 
AND t1.STORENUM = '1,' 
t1.date BETWEEN '2011-01-01' AND '2011-11-11' 
GROUP BY t1.date 
ORDER BY t1.date ASC 

你的別名t1和t2都只是使用相同的表,你需要再次計算。你之前的查詢很混亂。然後在where語句中添加所需的條件併發布您在此處如何再次使用

1

也許子選擇?

select * 
    from (
select sum(total) 
    , date 
    , rc 
    , storenum 
from T_SALES 
group by date, rc, storenum)T1 
left join(
select sum(total) 
    , date 
    , rc 
    , storenum 
from T_SALES 
group by date, rc, storenum)T2 
on T2.date = (T1.date - 1) 
and T2.storenum = T1.storenum