2014-11-03 93 views
1

我发现了一些与我需要的东西类似的东西,但我无法围绕如何将它带到需要的地方。SQL Dynamic Pivot without aggregate

这有助于确定的:simple(?) PIVOT without an aggregate


这里是我当前的查询:

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 

我需要commente d行( - LienID)不会被注释掉,并在相应的LienName之后返回LienID,例如(为了格式化目的,我删除了最后四列)。

Lien1   LienID Lien2  LienID  
Deed of Trust 123 Assignment 234  

也许Pivot是不能做到这一点的最好办法,但它是我迄今发现的最好的。我有5个表返回多行,我需要返回一行上的所有值。我一直在尝试理解这里的动态SQL数据透视问题,但是我一直无法执行一个来执行我需要执行的方式。

我接受任何和所有的建议,这将有助于 - 在此先感谢您的时间!


编辑:14年11月4日@ 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) 

的帮助下:Convert Rows to columns using 'Pivot' in SQL Server

+0

当你说_return的LienID相应LienName._之后是什么意思?结果应该是什么样子? – jpw 2014-11-03 21:56:06

+0

刚刚发布 - 谢谢! – 2014-11-03 23:34:02

+0

呵呵,你能在sqlfiddle上设置一组样本数据吗?我有这个想法应该可以工作,但是在编辑我的答案之前,我希望有一个实时引擎来测试。 – 2014-11-03 23:37:39

回答

0

如果我理解你的期望输出正确的,我认为这个查询应该这样做,请试一试:

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 
+0

就是这样!这令人沮丧,因为现在我意识到我需要做些什么来满足我的客户,这让我想哭。这就是说,我需要更进一步,以及如何使它变得动态。我使用的例子有6行返回,但实际上,它可能更多或更少。谢谢JPW! – 2014-11-04 13:07:47

+0

@jessicak。查询动态应该很容易,我可以稍后再看。 – jpw 2014-11-04 18:14:41

+1

我只是想通了,我想。这可能是我一生中写过的最丑陋的东西,但如果它每周在地板上每周节省25个小时,那么代码可能会像它一样丑陋。 – 2014-11-04 19:46:51

1

你快到了这一点。查询的另一个副本,在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 
+0

虽然这确实选择了留置权,但它并不完全是我要去的 - 但这是我的错,因为没有发布它应该看起来的样本就像我现在要做的那样。 – 2014-11-03 23:31:07