在SQL中按月和年分组

时间:2018-06-28 19:42:04

标签: sql

我正在尝试查询,我必须收到一个日期并提供一份报告,其中必须在月底显示总金额。

到目前为止,我是这样的:

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;

比较年份是因为我只需要获取同一年的月份即可。

我还附上了我的图表:

enter image description here

数据库的上下文大约是product rentals,我使用的表是租赁合同详细信息

我知道我得到了错误,因为当我输入特定日期时,我没有得到结果。我不知道我在做什么。我的查询是否正确?

我希望获得的是:

Amount |  Month | Year
  12        1     2017
  45        2     2017
          ...

这里是example

1 个答案:

答案 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而言,可能会过滤出要包含的行。