【问题标题】:Create multiple counts that vary by condition创建多个因条件而异的计数
【发布时间】:2019-04-13 11:35:39
【问题描述】:

我有一个运行良好的简单查询,但我需要在 12 个月 * 几年中改变条件“where”语句来运行它。我想生成 12 列,每列代表该月的计数;如果这些数据以某种方式以行的形式表示也是可以接受的。

当前查询:

SELECT  
    field1
    ,field2
    ,field3
      ,count(distinct(table1.field4))   

  FROM table1   
  inner join table2 
  on table1.field4=table2.field4
  where  year_month <=201808

group by    
    field1
    ,field2
    ,field3

order by    
    field1
    ,field2
    ,field3

【问题讨论】:

    标签: sql select count where multiple-columns


    【解决方案1】:

    你去吧:

    DECLARE @year INT,
        @i INT = 1,
        @date VARCHAR(6),
        @month INT = 1,
        @months INT = 12,
        @sql NVARCHAR(MAX)
    
    DECLARE @years TABLE (
        Id INT IDENTITY,
        myYear INT
    )
    
    INSERT INTO @years (myYear)
    VALUES (2016),
        (2017),
        (2018)
    
    CREATE TABLE #table (
        field1 [your data type],
        field2 [your data type],
        field3 [your data type],
        myDate VARCHAR(6),
        myCount INT
    )
    
    WHILE @i <= (SELECT MAX(Id) FROM @years)
    BEGIN
        SELECT @year = myYear
        FROM @years
        WHERE Id = @i
    
        WHILE @month <= @months
        BEGIN
            IF @month < 10
                SET @date = @year + '0' + CAST(@month as VARCHAR(2))
            ELSE
                SET @date = @year + CAST(@month as VARCHAR(2))
    
            SET @sql = 'INSERT INTO #table SELECT field1 ,field2 ,field3, year_month as myDate, count(distinct(table1.field4)) as myCount 
                FROM table1 JOIN table2 ON table1.field4 = table2.field4
                WHERE year_month = ''' + CAST(@date AS NVARCHAR(MAX)) + ''' GROUP BY field1, field2, field3, year_month ORDER BY year_month, field1, field2, field3'
    
            EXECUTE sp_executesql @sql
    
            SET @month = @month + 1
        END
    
        SET @month = 1
        SET @i = @i + 1
    END
    
    SELECT * FROM #table
    
    DROP TABLE #table
    

    【讨论】:

    • 谢谢!这是一个难以置信的帮助。我确实稍微修改了方法:
    猜你喜欢
    • 2023-03-16
    • 1970-01-01
    • 2020-11-21
    • 1970-01-01
    • 2015-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多