如何在透视中为列提供自定义名称
Posted
技术标签:
【中文标题】如何在透视中为列提供自定义名称【英文标题】:How to provide custom name to column in pivoting 【发布时间】:2016-05-12 10:32:41 【问题描述】:我有一张这样的桌子:
id unit
1 mm
2 cm
3 kg
当我对此执行枢轴操作时,我得到如下结果:
1 2 3
mm cm kg
是否可以在此处获取自定义列名,如下所示:
d1 d2 d3
mm cm kg
我为此使用 Pivot:
IF OBJECT_ID('tempdb..#t') IS NOT NULL
DROP TABLE #t
GO
CREATE table #t
(id varchar(max),unit varchar(max))
insert into #t (id,unit)values
(1,'kg'),
(2,'cm'),
(3,'mm'),
(4,'m')
DECLARE @statement NVARCHAR(max)
,@columns NVARCHAR(max)
SELECT @columns = ISNULL(@columns + ',', '') + N'[' + cast(tbl.id as varchar(max)) + ']'
FROM (
SELECT DISTINCT id
FROM #t
) AS tbl
SELECT @statement = 'select *
INTO ##temp
from (
SELECT id,[unit]
FROM #t
) as s
PIVOT
(max(unit) FOR id in(' + @columns + ')) as pvt
'
EXEC sp_executesql @statement = @statement
SELECT * FROM ##temp
DROP TABLE #t
DROP TABLE ##temp
有可能吗? 谢谢
【问题讨论】:
【参考方案1】:IF OBJECT_ID('tempdb..#t') IS NOT NULL
DROP TABLE #t
GO
CREATE TABLE #t (
id VARCHAR(10),
unit VARCHAR(100)
)
INSERT INTO #t (id, unit)
VALUES
('1', 'kg'),
('2', 'cm'),
('3', 'mm'),
('4', 'mm')
DECLARE @SQL NVARCHAR(MAX), @columns NVARCHAR(MAX)
SELECT @columns = STUFF((
SELECT ',[D' + id + ']'
FROM #t
FOR XML PATH('')), 1, 1, '')
SELECT @SQL = '
SELECT *
FROM (
SELECT [unit], col = N''D'' + id
FROM #t
) s
PIVOT (MAX(unit) FOR col IN (' + @columns + ')) p'
EXEC sys.sp_executesql @SQL
【讨论】:
【参考方案2】:只需为您的 ID 添加前缀即可。示例
SELECT @statement = 'select * INTO ##temp from
( SELECT [id] = ''d''+id,[unit] FROM #t ) as s
PIVOT
(max(unit) FOR id in(' + @columns + ')) as pvt '
使用全局临时表也是一种糟糕的做法!尤其是一个名为##temp
【讨论】:
是的,这只是一个练习示例。这就是我使用全局临时表的原因。关于答案,它不起作用。仍然给出 1,2.. 作为列名【参考方案3】:您可以在动态 sql 查询中使用 CASE
表达式。
CREATE TABLE #t
(
id INT,
unit VARCHAR(2)
);
INSERT INTO #t VALUES
(1,'mm'),
(2,'cm'),
(3,'kg');
DECLARE @query AS VARCHAR(MAX);
SELECT @query = 'SELECT ' +
STUFF
(
(
SELECT DISTINCT ',MAX(CASE WHEN id = '+ CAST(id AS VARCHAR(10))
+ ' THEN unit END) AS d' + CAST(id AS VARCHAR(10))
FROM #t
FOR XML PATH('')
),
1,1,'');
SELECT @query += ' FROM #t;';
EXECUTE(@query);
结果
+----+----+----+
| d1 | d2 | d3 |
+----+----+----+
| mm | cm | kg |
+----+----+----+
【讨论】:
【参考方案4】:SELECT @statement = 'select * INTO ##temp from ( SELECT ''d''+id AS [id],[unit] FROM #t ) as s PIVOT (max(unit) FOR id in(' + @columns + ')) as pvt '
【讨论】:
以上是关于如何在透视中为列提供自定义名称的主要内容,如果未能解决你的问题,请参考以下文章
如何在Java RS json响应中为简单列表类型设置自定义名称
如何在 Flask-Appbuilder 中为 OAuth2.0 使用自定义提供程序 [keycloak]?