2013-05-11 136 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

相关问题