在SQL中使用或不使用聚合动态地转动varchar字段 [英] Pivot varchar fields dynamically with or without aggregate in SQL
问题描述
我有一张桌子如下
TName Scode
AKAT Allow1
AKAT Allow2 >
AKAT Allow3
AKAT Allow4
AkCT Allow1
AKCT Allow2
AKCT Allow3 >
AKST Allow1
AKST Allow2
AKST Allow3
AKST Allow4
AKST Allow5 >
。 。
。 。
。 。
我想得到如下结果:
AKAT AKCT AKST。 。 。
Allow1 Allow1 Allow1。 。 。
允许2允许2允许2。 。 。
允许3允许3允许3。 。 。
Allow4 Allow4。
Allow5
我尝试过:
我通过谷歌搜索尝试了多个查询,但没有人帮助过。
可以有很多Tnames,所以我不能有静态查询。并且字段是varchar数据类型,所以不确定是否可以使用聚合。
我可以在表中添加一个TID列作为数字字段,但那些TID将是相同的特别是Tname。如果这有助于查询。
I have a table as below
TName Scode
AKAT Allow1
AKAT Allow2
AKAT Allow3
AKAT Allow4
AkCT Allow1
AKCT Allow2
AKCT Allow3
AKST Allow1
AKST Allow2
AKST Allow3
AKST Allow4
AKST Allow5
. .
. .
. .
I want a result as below:
AKAT AKCT AKST . . .
Allow1 Allow1 Allow1 . . .
Allow2 Allow2 Allow2 . . .
Allow3 Allow3 Allow3 . . .
Allow4 Allow4 .
Allow5
What I have tried:
I have tried multiple queries by googling but none have helped.
There can be many Tnames so i cannot have a static query. and the fields are varchar datatype so not sure if aggregate can be used.
I can add a TID column in the table as numeric field but those TID's will be same for particular Tname. if thats helpful in querying.
推荐答案
检查:
Check this:
CREATE TABLE #tmp (TName VARCHAR(30), Scode VARCHAR(30))
INSERT INTO #tmp(TName, Scode)
VALUES('AKAT', 'Allow1'),
('AKAT', 'Allow2'),
('AKAT', 'Allow3'),
('AKAT', 'Allow4'),
('AkCT', 'Allow1'),
('AKCT', 'Allow2'),
('AKCT', 'Allow3'),
('AKST', 'Allow1'),
('AKST', 'Allow2'),
('AKST', 'Allow3'),
('AKST', 'Allow4'),
('AKST', 'Allow5')
DECLARE @cols NVARCHAR(4000) = STUFF((SELECT DISTINCT '],[' + TName
FROM #tmp
ORDER BY '],[' + TName
FOR XML PATH('')) , 1, 2, '') + ']'
--SELECT @cols
DECLARE @Qry NVARCHAR(MAX) = N'
SELECT RowNo, ' + @cols +
'FROM (
SELECT ROW_NUMBER() OVER(PARTITION BY TName ORDER BY Scode) As RowNo, *
FROM #tmp
) dt
PIVOT (MAX(Scode) FOR TName IN(' + @cols + ')) pvt'
EXEC(@Qry)
DROP TABLE #tmp
结果:
Result:
RowNo AKAT AkCT AKST
1 Allow1 Allow1 Allow1
2 Allow2 Allow2 Allow2
3 Allow3 Allow3 Allow3
4 Allow4 NULL Allow4
5 NULL NULL Allow5
这篇关于在SQL中使用或不使用聚合动态地转动varchar字段的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!