MySQL的。查询两个特定日期间隔之间的销售额

时间:2013-05-11 12:55:17

标签: mysql mysql-workbench

我正在尝试使用类别编号,类别名称和特定日期间隔之间的此类别编号的总销售额来编写查询。

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;

问题是这不会返回任何预期值。我对这部分之间的特别不确定,需要一些建议才能让它发挥作用。谢谢。

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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和日期比较。)

  • 您按一列k.Catnr进行分组,但在SELECT列表中使用了更多列而没有聚合函数。这不是标准的ANSI / ISO SQL,会给你不确定的结果。如果表k.Catnr的主键是kategori(可疑),则可以跳过k.name列表中的GROUP BY但我建议您仍然执行此操作。

    对于lin.Price * lin.Number,我怀疑你想要这些乘法的总和:SUM(lin.Price * lin.Number)

  • WHERE列表中的条件使用隐式连接是旧的,非常古老的语法。 “new”(1992)语法是使用关键字JOIN,它提供了更大的灵活性。加入条件和限制条件是分开的。有许多类型的联接可供选择(LEFTRIGHTCROSSNATURAL)加入(甚至是FULL联接,如果您转移到其他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 ;