我正在尝试使用类别编号,类别名称和特定日期间隔之间的此类别编号的总销售额来编写查询。
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 :(得分: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
值时有效,但如果您有DATETIME
或TIMESTAMP
列/表达式,则无法按预期工作。使用>=
和<
更安全,如下所示:
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
,它提供了更大的灵活性。加入条件和限制条件是分开的。有许多类型的联接可供选择(LEFT
,RIGHT
,CROSS
,NATURAL
)加入(甚至是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 ;