繁体   English   中英

在SQL Server中透视日期

[英]Pivoting Date in SQL Server

我在SQL Server中具有以下代码,该代码通过CodeDate生成用户计数:

SELECT
    code, CONVERT(DATE, created_at) Date, COUNT(account_id) UserCount
FROM 
    Code_Table
GROUP BY
    code, CONVERT(DATE, created_at)

这只是通过每个唯一的代码和日期组合来生成用户计数。 我正在尝试使用Pivot函数来获取:

  • 第一列中的唯一代码列表
  • 每个唯一日期的一列,从第二列开始
  • 与填充表的日期代码组合关联的每个用户的计数。

我遇到的一个问题是:我想将此查询设置为每天自动更新,这将在每天的最新日期中添加一列。 我发现的唯一枢轴函数需要声明从行创建的列数。

我知道在带有Pivot的Excel中更容易完成此操作,但是我目前没有该选项。

任何建议将不胜感激!

您需要动态的枢纽才能完成此任务。 您正确的需要一个显式的列列表-因此您将查询表并实际生成SQL语法作为结果,然后使用sp_executesql执行该语法。

您可以在Stack Overflow上找到: SQL Server动态PIVOT查询?

警告:这通常不是最佳做法。 您将无法对此结果集执行任何过滤或任何与日期相关的逻辑。 无论您使用哪种前端报告软件,都可能想在其中实现矩阵/交叉表,例如从旋转获得的行为。

尝试使用此存储过程:

CREATE PROCEDURE GetData 
    -- Add the parameters for the stored procedure here
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    DECLARE @columns varchar(MAX) = '';

    SELECT @columns = @columns + '[' + CONVERT(VARCHAR,ct.created_at) + '],'  
    FROM Code_Table ct
    GROUP BY created_at
    ORDER BY created_at ASC;

    SET @columns = SUBSTRING(@columns,1,LEN(@columns) - 1);

    DECLARE @query varchar(MAX)= 'SELECT  
                                    *
                                  FROM 
                                    (SELECT code,account_id,created_at from Code_Table) AS result
                                  PIVOT 
                                    (
                                     COUNT(account_id) FOR created_at IN ('+ @columns +')
                                    ) p'
                                  ;

    EXEC (@query)
END

我根据日期的现有值动态构建了列的标题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM