2013-05-11 74 views
1

我試圖用特定日期間隔內的類別編號,類別名稱和此類別編號的總銷售額寫出查詢。MySQL。查詢兩個特定日期間隔內的銷售額

SELECT k.CatNr, k.name, lin.Price * lin.Number Totale_Sale 
FROM kategori k, vare v, ordrelinje lin, ordre ord 
WHERE k.CatNr = v.CatNr 
AND v.VNr = lin.VNr 
AND lin.OrderNr = ord.OrderNr 
AND ord.Date BETWEEN 2011-01-14 AND 2011-01-15 
GROUP BY k.Catnr; 

問題是,這不會返回任何預期值。我特別不確定部分內容,需要一些建議才能使其工作。謝謝。

+0

是'ord.Date'一個'DATE',一個'DATETIME'或'TIMESTAMP'列? – 2013-05-11 13:03:26

回答

0

幾件事情:

  • 日期文本需要使用單引號: '2011-01-14' AND '2011-01-15'。另外,引擎認爲你有數字和減法。 2011-01-14被評估爲1996

  • 雖然ord.Date BETWEEN '2011-01-14' AND '2011-01-15'作品比較DATE值時,它不會,如果你有DATETIMETIMESTAMP列/表達式按預期工作。它的安全使用>=<,像這樣:

    ord.Date >= '2011-01-14' AND ord.Date < '2011-01-15' + INTERVAL 1 DAY 
    

    閱讀這篇文章What do BETWEEN and the devil have in common?更多的解釋(這篇文章是關於SQL-Server,但同樣的原則也適用於MySQL中,有關BETWEEN和日期比較。 )

  • 您按1列k.Catnr分組,但在SELECT列表中使用更多列而沒有集合函數。這不是標準的ANSI/ISO SQL,會給你不確定的結果。如果k.Catnr(如懷疑)表kategori的主鍵,則可以跳過將k.name放入GROUP BY列表中,但我建議您無論如何都要這樣做。

    對於lin.Price * lin.Number不過,我懷疑你希望這些乘法的總和:SUM(lin.Price * lin.Number)

  • 使用與在WHERE列表中的隱含條件是連接老很老的語法。 「新」(1992)語法是使用關鍵字JOIN,它提供了更多的靈活性。加入條件和限制條件是分開的。有很多類型的連接可供選擇(LEFT,RIGHT,CROSS,NATURAL)連接(如果您遷移到其他DBMS連接它們,在MySQL中不可用),我強烈建議您學習使用此語法。您可以在定義別名時使用(或不)關鍵字AS。如果你喜歡它,這取決於你。這不是強制性的。

所有建議的更改後,查詢變爲:

SELECT 
    k.CatNr, 
    k.name, 
    SUM(lin.Price * lin.Number) AS Totale_Sale 
FROM 
    kategori k 
    JOIN 
    vare AS v 
     ON k.CatNr = v.CatNr 
    JOIN 
    ordrelinje AS lin 
     ON v.VNr = lin.VNr 
    JOIN 
    ordre AS ord 
     ON lin.OrderNr = ord.OrderNr 
WHERE 
    ord.Date >= '2011-01-14' 
    AND 
    ord.Date < '2011-01-15' + INTERVAL 1 DAY 
GROUP BY 
    k.Catnr, 
    k.name ; 
+0

非常感謝您的建議! – kvambaam 2013-05-11 14:39:11

0

使用引號BETWEEN '2011-01-14' AND '2011-01-15'

lin.Price * lin.Number AS Totale_Sale

SELECT k.CatNr, k.name, 
     lin.Price * lin.Number AS Totale_Sale 
FROM kategori k, vare v, ordrelinje lin, ordre ord 
WHERE k.CatNr = v.CatNr 
AND v.VNr = lin.VNr 
AND lin.OrderNr = ord.OrderNr 
AND ord.Date BETWEEN '2011-01-14' AND '2011-01-15' 
GROUP BY k.Catnr; 
+0

'AS'很好,但不是必需的。 – 2013-05-11 13:11:03

+0

感謝此工作 – kvambaam 2013-05-11 14:44:59

相關問題