【问题标题】:Group by Month displaying duplicate months in SQL按月分组,在 SQL 中显示重复的月份
【发布时间】:2014-03-25 18:02:12
【问题描述】:

我有一个记录仓库数据库事务的表。该表中的信息包括交易发生的地点、交易结束的日期、结束的时间、转移的数量和部门。我试图得到: - 每个部门每月的单位和交易数量如下:

Division Month Transactions Units
1 January 5 10 1 February 10 11 2 February 5 10

我的SQL查询如下:

SELECT
    DISTINCT  tranl.Division, 
    DATENAME(month,tranl.trandate) AS 'Month',
    COUNT(tranl.qty) AS Transactions,
    SUM(tranl.qty) AS Units
FROM translog (nolock) tranl 
WHERE tranl.location = 'stage' 
AND end_tran_date >= '2013-04-01 00:00:00.000' 
GROUP BY end_tran_date, tranl.Division
ORDER BY  tranl.Division

但我得到了不同的结果:

Division Month Transactions Units 1 January 5 10 1 January 3 22 2 February 10 40 2 February 3 12 2 March 1 1 ....

【问题讨论】:

  • 你能给出创建 DW 表的 sql 以及一些示例行吗?

标签: sql sql-server date transactions group-by


【解决方案1】:

您按 end_tran_date 分组,但您只想按该日期的月份部分分组。以下可能会起作用:

select 
    DISTINCT  tranl.Division, 
    DATENAME(month,tranl.trandate) as 'Month',
     COUNT(tranl.qty) as TRANSACTIONS,
     SUM(tranl.qty) as UNITS
    from translog (nolock) tranl 
    where tranl.location = 'stage' 
   and end_tran_date >= '2013-04-01 00:00:00.000' 
   GROUP BY DATENAME(month,tranl.trandate), tranl.Division
   ORDER BY  tranl.Division

【讨论】:

    【解决方案2】:

    GROUP BY 子句需要指定数据应该按月分组和可能的年份(虽然您没有指定,但我假设您不希望不同年份的交易汇总):

    SQL Server 2012

    SELECT
        DISTINCT tranl.division,
        FORMAT(end_tran_date, 'yyyy-MM', 'en-us') AS Month,
        Count(tranl.qty) AS Transactions,
        Sum(tranl.qty) AS Units     
    FROM
        translog (nolock) tranl      
    WHERE
        tranl.location = 'stage'             
        AND end_tran_date >= '2013-04-01 00:00:00.000'      
    GROUP  BY
        tranl.division,
        FORMAT(end_tran_date, 'yyyy-MM', 'en-us')      
    ORDER  BY
        tranl.division
    

    SQL Server 2008

    SELECT
        DISTINCT tranl.division,
        CONVERT(VARCHAR(7), end_tran_date, 120) AS Month,
        Count(tranl.qty) AS Transactions,
        Sum(tranl.qty) AS Units     
    FROM
        translog (nolock) tranl      
    WHERE
        tranl.location = 'stage'             
        AND end_tran_date >= '2013-04-01 00:00:00.000'      
    GROUP  BY
        tranl.division,
        CONVERT(VARCHAR(7), end_tran_date, 120)      
    ORDER  BY
        tranl.division
    

    如果您可以使用,我认为使用 FORMAT 的 SQL Server 2012 语法比用于格式化日期的神秘 CONVERT 语法更易于阅读。

    【讨论】:

    • 这也行得通,只是需要调整格式,谢谢!
    猜你喜欢
    • 2014-01-30
    • 2015-08-14
    • 1970-01-01
    • 2012-12-04
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 2020-04-03
    • 2020-09-27
    相关资源
    最近更新 更多