首页 > 数据库 > mysql教程 > 如何使用 SQL 连接列、数据透视数据以及唯一 ID 和月份组合的总和计数?

如何使用 SQL 连接列、数据透视数据以及唯一 ID 和月份组合的总和计数?

DDD
发布: 2025-01-03 18:09:40
原创
687 人浏览过

How can SQL be used to concatenate columns, pivot data, and sum counts for unique ID and month combinations?

使用 SQL 连接列和透视数据

问题:

您有一个数据库表示 ID、类型、子类型、计数和月份的列。如何将此数据转换为新格式,其中类型和子类型连接到新列中,并对 ID 和月份的每个唯一组合的计数进行求和?

解决方案:

要实现这种转换后的输出,您可以利用 SQL Server 2005 中的 PIVOT 运算符。PIVOT 运算符允许您将行动态转置为

以下代码片段演示了如何使用 PIVOT 来实现所需的结果:

DECLARE @sql AS varchar(max)
DECLARE @pivot_list AS varchar(max) -- Leave NULL for COALESCE technique
DECLARE @select_list AS varchar(max) -- Leave NULL for COALESCE technique

SELECT @pivot_list = COALESCE(@pivot_list + ', ', '') + '[' + PIVOT_CODE + ']'
        ,@select_list = COALESCE(@select_list + ', ', '') + 'ISNULL([' + PIVOT_CODE + '], 0) AS [' + PIVOT_CODE + ']'
FROM (
    SELECT DISTINCT [TYPE] + '_' + SUBTYPE AS PIVOT_CODE
    FROM stackoverflow_159456
) AS PIVOT_CODES

SET @sql = '
;WITH p AS (
    SELECT ID, [MONTH], [TYPE] + ''_'' + SUBTYPE AS PIVOT_CODE, SUM([COUNT]) AS [COUNT]
    FROM stackoverflow_159456
    GROUP BY ID, [MONTH], [TYPE] + ''_'' + SUBTYPE
)
SELECT ID, [MONTH], ' + @select_list + '
FROM p
PIVOT (
    SUM([COUNT])
    FOR PIVOT_CODE IN (
        ' + @pivot_list + '
    )
) AS pvt
'

EXEC (@sql)
登录后复制

实现细节:

  1. 生成动态数据透视列表:代码根据唯一的动态创建数据透视列列表原始表中类型和子类型的组合。
  2. 构建 PIVOT 查询: 主 PIVOT 查询首先创建一个名为“p”的公用表表达式 (CTE),该表达式按 ID 对数据进行分组,月份,以及串联类型和子类型。然后,它将每个组的计数相加。
  3. 将行转置为列: PIVOT 运算符应用于 CTE“p”,以将行转置为列。数据透视列列表是使用 @pivot_list 变量动态生成的。
  4. 处理空值(可选):通过使用 COALESCE 函数,@select_list 变量中的 ISNULL() 条件可以是用于将透视列中的空值替换为零。

执行 @sql 变量将返回带有连接列和求和计数的所需表。该解决方案可以高效、动态地聚合复杂数据。

以上是如何使用 SQL 连接列、数据透视数据以及唯一 ID 和月份组合的总和计数?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板