栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

基于SQL中分组列的列上的数据透视表值

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

基于SQL中分组列的列上的数据透视表值

如果您现在知道结果中将要包含多少列,则需要使用动态T-SQL语句来构建

PIVOT
。例如:

IF OBJECT_ID('tempdb..#DataSource') IS NOT NULLBEGIN;    DROp TABLE #DataSource;END;CREATE TABLE #DataSource(    [id] INT   ,[Code] INT   ,[EntityId] INT);DECLARE @DynamicTSQLStatement NVARCHAr(MAX)       ,@Columns NVARCHAr(MAX);DECLARE @MaxColumns INT;INSERT INTO #DataSource ([id], [Code], [EntityId])VALUES (3, 22209776 , 1)      ,(4, 143687971, 3)      ,(4, 143687971, 4)      ,(4, 143687971, 5)      ,(4, 143687971, 15)      ,(5, 143658155, 7)      ,(5, 143658155, 8)      ,(4, 143687971, 25)      ,(4, 143687971, 26);-- we need to know how many columns are going to be shownSELECT TOP 1 @MaxColumns = COUNT(*)FROM #DataSourceGROUP BY [Code]ORDER BY COUNT(*) DESC;-- we are building here the following string '[1],[2],[3],[4],[5],[6]'; -- this will change depending the input dataWITH gen AS (    SELECt 1 AS num    UNIOn ALL    SELECT num+1     FROM gen     WHERe num+1<=@MaxColumns)SELECt @Columns = STUFF(    (        SELECT ',[EntityId' + CAST([num] AS VARCHAr(12)) + ']'        FROM gen        FOR XML PATH(''), TYPE    ).value('.', 'VARCHAr(MAX)')    ,1    ,1    ,'')OPTION (maxrecursion 10000);SET @DynamicTSQLStatement = N'SELECt *FROM (     SELECt [id]          ,[Code]          ,[EntityId]          ,''EntityId'' + CAST(ROW_NUMBER() OVER(PARTITION BY [Code] ORDER BY [EntityId]) AS VARCHAr(12))    FROM #DataSource) DS ([id], [Code], [EntityId], [RowID])PIVOT (    MAX([EntityId]) for [RowID] in (' + @Columns +')) PVT;';EXEC sp_executesql @DynamicTSQLStatement;


转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/385648.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号