【问题标题】:Get sum of value for each month grouped by specific field获取按特定字段分组的每个月的总和
【发布时间】:2016-11-01 20:30:16
【问题描述】:

我在 SQL Server 2012 中有一个视图,它显示了一些项目的事务,如下所示:

物品交易简化视图示例

我需要显示每个月每个项目的总成本总和(数量乘以成本),并将月份显示为如下所示的列

【问题讨论】:

    标签: sql sql-server-2012 group-by


    【解决方案1】:

    试试这个。

    SELECT  * FROM (SELECT  
                SUM(Cost) AS Cost, 
                CONVERT(VARCHAR(3), DATENAME(MONTH, DATEADD(MONTH, MONTH(MonthCol), - 1))) MonthCol
                FROM myTable WHERE YEAR(MonthCol) = 2016
                GROUP BY  MonthCol) AS TP
         PIVOT (SUM(Cost) FOR MonthCol IN ([Jan], [Feb], [Mar], [Apr], [May], [Jun], [Jul], [Aug], [Sep], [Oct], [Nov], [Dec])) AS PVTTable
    

    对于动态查询月份和年份

        DECLARE @CurrMonth DATE = GETDATE();
        DECLARE @CurrYear NVARCHAR(4) = CAST(YEAR(@CurrMonth) AS NVARCHAR(4))
        DECLARE @END_MM INT = MONTH(@CurrMonth) --Current Month 
        DECLARE @START_MM INT = 1 --Start Month of Current Year
    
        DECLARE @TB_DATE AS TABLE
        (
            ID INT IDENTITY(1,1),
            DATE_LIST VARCHAR(12)
        )
        WHILE @START_MM <= @END_MM
        BEGIN
            INSERT INTO @TB_DATE (DATE_LIST) VALUES ('['+CONVERT(VARCHAR(3),DATENAME(MONTH, DATEADD(month, @START_MM-1, CAST(@END_MM AS datetime))))+']')
            SET @START_MM=@START_MM+1
        END
    
        DECLARE @MM_LIST NVARCHAR(MAX) = (SELECT STUFF((SELECT ',' + DATE_LIST 
                            FROM @TB_DATE ORDER BY ID DESC
                            FOR XML PATH('')) ,1,1,'') AS Txt)
    
        DECLARE @DynamicPivot AS NVARCHAR(MAX)
        SET @DynamicPivot = N'SELECT * FROM (SELECT  
            ItemId,
            ItemName,
            SUM(TotalCost) AS TotalCost, 
            CONVERT(VARCHAR(3), 
            DATENAME(MONTH, DATEADD(MONTH, MONTH(TransDate), - 1))) TransDate
            FROM myTable WHERE YEAR(TransDate) = '+@CurrYear+'
            GROUP BY  TransDate,ItemId,ItemName) AS TP
     PIVOT (SUM(TotalCost) FOR TransDate IN ('+@MM_LIST+')) AS PVTTable';
    
     EXEC sp_executesql @DynamicPivot
    

    【讨论】:

    • 非常感谢,但是如果我想控制要显示多少个月,例如:如果我想在 7 月之前显示几个月,这可能吗?
    • 是的,我们可以,请尝试在动态月份查询中作为我的答案
    • 非常感谢。
    猜你喜欢
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多