1

我正在尝试编写一个带有类别编号、类别名称和特定日期间隔之间该类别编号的总销售额的查询。

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;

问题是这不会返回任何预期值。我特别不确定中间部分,需要一些建议才能使其正常工作。谢谢。

4

2 回答 2

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;
于 2013-05-11T12:58:11.703 回答
0

几件事:

  • 日期文字需要单引号:'2011-01-14' AND '2011-01-15'. 否则,引擎认为你有数字和减法。2011-01-14被评估为 number 1996

  • 虽然ord.Date BETWEEN '2011-01-14' AND '2011-01-15'在比较值时有效,但如果您有或列/表达式DATE,它将无法按预期工作。使用and更安全,如下所示:DATETIMETIMESTAMP>=<

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

    阅读这篇文章BETWEEN 和魔鬼有什么共同点?更多解释(这篇文章是关于 SQL-Server 但同样的原则适用于 MySQL,关于BETWEEN日期比较。)

  • 您按一列分组,k.Catnr但您在列表中使用更多列SELECT而不使用聚合函数。这不是标准的 ANSI/ISO SQL,会给你不确定的结果。如果k.Catnr(怀疑)是 table 的主键kategori,你可以跳过放入k.name列表GROUP BY,但我建议你还是这样做。

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

  • 对列表中的条件使用隐式连接WHERE是旧的、非常古老的语法。“新”(1992)语法是使用JOIN提供更多灵活性的关键字。加入条件和限制条件是分开的。有许多类型的连接可供选择 ( LEFT, RIGHT, CROSS, NATURAL) 连接(如果您移动到其他有这些连接的 DBMS,甚至可以FULL连接,这在 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 ;
于 2013-05-11T13:30:00.067 回答