Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Динамично интерполиране на допълнителни редове в SQL заявка

Първата стъпка би била да добавите RowNumber колона за идентифициране на първия ред за всеки PorfoilioGroupID:

SELECT  p.PortfolioGroupID, 
        p.PortfolioGroupCode, 
        p.DisplayOrder, 
        p.MemberCode, 
        m.ContactCode, 
        m.Custom01, 
        RowNumber = ROW_NUMBER() OVER(PARTITION BY P.PortfolioGroupID ORDER BY m.ContactCode, p.MemberCode)
FROM    [APXFirm].[AdvApp].[vPortfolioGroupMemberFlattened] p
        LEFT OUTER JOIN [APXFirm].[AdvApp].[vPortfolioInterestedParty] m
            ON p.memberid = m.PortfolioID
WHERE   m.ContactCode is not null
AND     p.PortfolioGroupCode like '%_Package'
ORDER BY m.ContactCode, p.MemberCode;

След това можете да обедините своя набор от резултати с табличен конструктор с вашите 3 стойности (Cover, Sperator, Report) и просто да добавите клауза where, за да гарантирате, че „Cover“ се появява само за първия ред:

WITH Data AS
(   SELECT  p.PortfolioGroupID, 
            p.PortfolioGroupCode, 
            p.DisplayOrder, 
            p.MemberCode, 
            m.ContactCode, 
            m.Custom01, 
            RowNumber = ROW_NUMBER() OVER(PARTITION BY P.PortfolioGroupID ORDER BY p.DisplayOrder)
    FROM    [APXFirm].[AdvApp].[vPortfolioGroupMemberFlattened] p
            LEFT OUTER JOIN [APXFirm].[AdvApp].[vPortfolioInterestedParty] m
                ON p.memberid = m.PortfolioID
    WHERE   m.ContactCode is not null
    AND     p.PortfolioGroupCode like '%_Package'
)
SELECT  d.PortfolioGroupID, 
        d.PortfolioGroupCode, 
        d.DisplayOrder, 
        d.MemberCode, 
        d.ContactCode, 
        d.Custom01, 
        t.PDFType
FROM    Data d
        CROSS JOIN 
        (   VALUES
                ('Cover'),
                ('Seperator'),
                ('Report')
        ) t (PDFType)
WHERE   d.RowNumber = 1
OR      t.PDFType != 'Cover'
ORDER BY ContactCode, MemberCode;

Пример за SQL Fiddle




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL - Създайте временна таблица или CTE на първия ден от месеца и имената на месеците

  2. Файловете FILESTREAM остават след изтриването на реда

  3. Как да вмъкнете стойности в колона IDENTITY в SQL Server

  4. DECRYPTBYASYMKEY() Не връща очаквана стойност

  5. NHibernate 3 указва sql тип данни с говорлив синтаксис