![](/img/trans.png)
[英]SQL Pivot with dynamic generated columns, aggregate function and columns without aggregation
[英]SQL Dynamic Pivot without aggregate
我已经找到了一些与我需要的东西类似的东西,但是我无法围绕如何将其带到需要的地方进行思考。
这肯定有助于: 没有汇总的简单(?)PIVOT
这是我当前的查询:
SELECT [1] AS Lien1
,[2] AS Lien2
,[3] AS Lien3
,[4] AS Lien4
,[5] AS Lien5
,[6] AS Lien6
FROM ( SELECT lt.Name AS [LienName]
-- ,LienID
,ROW_NUMBER() OVER ( ORDER BY LienID ) AS RN
FROM dbo.Lien AS L
INNER JOIN dbo.LienType AS LT ON LT.LienTypeID = L.LienTypeID
WHERE FileID = 528267
) AS PivotSource PIVOT
( MAX(LienName) FOR RN IN ( [1], [2], [3], [4], [5], [6] ) ) piv
返回以下结果:
Lien1 Lien2 Lien3 Lien4 Lien5 Lien6
Deed of Trust Assignment Appointment of Substitute Trustee Assignment Assignment Civil Foreclosure Case
我需要注释行(-LienID)不被注释掉,并在相应的LienName之后返回LienID,例如(出于格式化目的,我删除了最后四列)。
Lien1 LienID Lien2 LienID
Deed of Trust 123 Assignment 234
也许Pivot并不是执行此操作的最佳方法,但这是迄今为止我发现的最好方法。 我有5个表返回多行,我需要在一行上返回所有值。 我一直在尝试了解此处的动态SQL Pivot问题,但是我无法执行一个以所需的方式执行。
我乐意接受任何有帮助的建议-在此先感谢您的宝贵时间!
编辑:11/4/14 @ 10:47AM
我想返回并发布正在进行的工作,因为我已经将这个答案变成了某种动态查询。
DECLARE @FileID INT = 528267
DECLARE @Cols NVARCHAR(MAX)
DECLARE @query NVARCHAR(MAX)
SELECT @cols = STUFF((SELECT ',' + QUOTENAME('LienNumber' + CONVERT(VARCHAR, ROW_NUMBER() OVER ( ORDER BY SortOrder )))
FROM dbo.Lien AS L
INNER JOIN dbo.LienType AS LT ON LT.LienTypeID = L.LienTypeID
INNER JOIN dbo.FileActions AS FA ON fa.FileID = l.FileID
AND fa.ActionDefID = 1184
AND fa.SentDate IS NOT NULL
AND fa.ReceivedDate IS NULL
AND fa.FileID = @FileID
FOR XML PATH('')
,TYPE
).value('.', 'NVARCHAR(MAX)'), 1, 1, '')
SET @Query = 'DECLARE @FileID INT = 528267 SELECT ' + @cols + '
FROM (select lt.name as Name, ''LienNumber'' + CONVERT(VARCHAR, ROW_NUMBER() OVER ( ORDER BY SortOrder )) as RN
FROM
dbo.Lien AS L
INNER JOIN dbo.LienType AS LT ON LT.LienTypeID = L.LienTypeID
INNER JOIN dbo.FileActions AS FA ON fa.FileID = l.FileID
AND fa.ActionDefID = 1184
AND fa.SentDate IS NOT NULL
AND fa.ReceivedDate IS NULL
AND fa.FileID = @FileID
) x
pivot ( MAX(name) FOR RN IN ( ' + @Cols + ' ) ) p'
EXEC (@query)
借助以下帮助: 在SQL Server中使用“数据透视”将行转换为列
您已经准备就绪。 查询的另一个副本,以ID为中心,然后通过fileID再次加入,应该可以解决问题。 这是SQLFiddle 。
SELECT
a.FileID
,a.Lien1
,b.LienID1
,a.Lien2
,b.LienID2
,a.Lien3
,b.LienID3
,a.Lien4
,b.LienID4
,a.Lien5
,b.LienID5
,a.Lien6
,b.LienID6
FROM (
SELECT
FileID
,[1] AS Lien1
,[2] AS Lien2
,[3] AS Lien3
,[4] AS Lien4
,[5] AS Lien5
,[6] AS Lien6
FROM ( SELECT
FileID
,LienName
,ROW_NUMBER() OVER ( ORDER BY LienID ) AS RN
FROM dbo.Lien AS L
WHERE FileID = 528267
) AS PivotSource
PIVOT ( MAX(LienName) FOR RN IN ( [1], [2], [3], [4], [5], [6] ) ) piv1
) a
INNER JOIN (
SELECT
FileID
,[1] AS LienID1
,[2] AS LienID2
,[3] AS LienID3
,[4] AS LienID4
,[5] AS LienID5
,[6] AS LienID6
FROM ( SELECT
FileID
,LienID
,ROW_NUMBER() OVER ( ORDER BY LienID ) AS RN
FROM dbo.Lien AS L
WHERE FileID = 528267
) AS PivotSource
PIVOT ( MAX(LienID) FOR RN IN ( [1], [2], [3], [4], [5], [6] ) ) piv1
) b ON a.FileID = b.FileID
如果我正确理解了所需的输出,我认为此查询应该做到这一点,请尝试一下:
SELECT
Lien1 = MAX([1]),
LienID = MAX([r1]),
Lien2 = MAX([2]),
LienID = MAX([r2]),
Lien3 = MAX([3]),
LienID = MAX([r3]),
Lien4 = MAX([4]),
LienID = MAX([r4]),
Lien5 = MAX([5]),
LienID = MAX([r5]),
Lien6 = MAX([6]),
LienID = MAX([r6])
FROM (
SELECT
lt.Name AS [LienName]
,LienID
,ROW_NUMBER() OVER ( ORDER BY LienID ) AS RN1
,'r'+CAST(ROW_NUMBER() OVER ( ORDER BY LienID ) AS varchar(10)) AS RN2
FROM Lien AS L
INNER JOIN LienType AS LT ON LT.LienTypeID = L.LienTypeID
WHERE FileID = 528267
) AS PivotSource
PIVOT ( MAX(LienName) FOR RN1 IN ( [1], [2], [3], [4], [5], [6] ) ) as names
PIVOT ( MAX(LienID) FOR RN2 IN ( [r1], [r2], [r3], [r4],[r5],[r6] ) ) as ids
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.