我正在尝试查询,我必须收到一个日期并提供一份报告,其中必须在月底显示总金额。
到目前为止,我是这样的:
CREATE PROCEDURE consulta
@fecha DATE
AS
SELECT
SUM(dca.UNIDADES) as Amount,
MONTH(ca.FINICIO) as Month,
YEAR(ca.FINICIO)
FROM
DETALLE_CONTRATO_ALQUILER dca
INNER JOIN
CONTRATOALQUILER ca ON dca.CODCONTRATO = ca.CODCONTRATO
AND ca.FINICIO >= @fecha
AND YEAR(ca.FINICIO) = YEAR(@fecha)
GROUP BY
MONTH(ca.FINICIO), YEAR(ca.FINICIO)
HAVING
SUM(dca.UNIDADES) > 2;
比较年份是因为我只需要获取同一年的月份即可。
我还附上了我的图表:
数据库的上下文大约是product rentals
,我使用的表是租赁合同和详细信息
我知道我得到了错误,因为当我输入特定日期时,我没有得到结果。我不知道我在做什么。我的查询是否正确?
我希望获得的是:
Amount | Month | Year
12 1 2017
45 2 2017
...
这里是example
答案 0 :(得分:0)
我假设两个表的所有行在另一个表中都有匹配的行,所以您需要INNER JOIN
。
您的查询中有一个小细节,让人闻到腥。您的联接包括过滤条件,这些条件可能会使查询中的行丢失。也许应该将过滤条件放在WHERE
子句中,而不是JOIN
子句中,如:
SELECT
SUM(dca.UNIDADES) as Amount,
MONTH(ca.FINICIO) as Month,
YEAR(ca.FINICIO)
FROM
DETALLE_CONTRATO_ALQUILER dca
INNER JOIN
CONTRATOALQUILER ca ON dca.CODCONTRATO = ca.CODCONTRATO
WHERE ca.FINICIO >= @fecha -- Using WHERE instead of JOIN here!
AND YEAR(ca.FINICIO) = YEAR(@fecha)
GROUP BY
MONTH(ca.FINICIO), YEAR(ca.FINICIO)
HAVING
SUM(dca.UNIDADES) > 2;
您可以在JOIN
子句中进行过滤,这对OUTER JOIN
很有用。但是,对于适用于联接本身的INNER JOIN
而言,可能会过滤出要包含的行。