Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

एसक्यूएल क्वेरी गतिशील रूप से पिवट का उपयोग कर वित्तीय माह जोड़ने के लिए

ऐसा करने के लिए आपको डायनेमिक SQL का उपयोग करना होगा। रफ कोड इसके समान होगा:

ALTER PROCEDURE [dbo].[_sp_GetDMActivityTrackerReport]
    @CoachId VARCHAR(7),
    @Month INT,
    @FiscalYear INT
AS 
BEGIN    

INSERT @FiscalMonth (ID,Month,NbHolidays,MonthDate,TotalDays)
EXECUTE dbo._sp_GetFiscalMonths @Month, @FiscalYear

DECLARE @cols AS NVARCHAR(MAX),
    @colsNull AS NVARCHAR(MAX),
    @colsSum AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(DateName(Month,nft.MonthPeriodStart)) 
                    from NonFieldTime nft
                    where datename(Month,nft.MonthPeriodStart) + '-'+ substring(datename(Year,nft.MonthPeriodStart),3,2) 
                        IN (SELECT Month +'-' +substring(datename(Year,MonthDate),3,2) [Months] 
                            FROM [email protected])
            FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'')

select @colsNull = STUFF((SELECT distinct ', IsNull(' + QUOTENAME(DateName(Month,nft.MonthPeriodStart))+', 0) as '+DateName(Month,nft.MonthPeriodStart)
                    from NonFieldTime nft
                    where datename(Month,nft.MonthPeriodStart) + '-'+ substring(datename(Year,nft.MonthPeriodStart),3,2) 
                        IN (SELECT Month +'-' +substring(datename(Year,MonthDate),3,2) [Months] 
                            FROM [email protected])
            FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') ,1,1,'')

select @colsSum = STUFF((SELECT distinct '+ IsNull(' + QUOTENAME(DateName(Month,nft.MonthPeriodStart))+', 0)'
                    from NonFieldTime nft
                    where datename(Month,nft.MonthPeriodStart) + '-'+ substring(datename(Year,nft.MonthPeriodStart),3,2) 
                        IN (SELECT Month +'-' +substring(datename(Year,MonthDate),3,2) [Months] 
                            FROM [email protected])
            FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)') ,1,1,'')+' as [Total Field TIME] '

set @query = 'SELECT PreparationID,CoachId,UserID, MemberID,
                    [Rep Name], ' + @colsNull + ', '+ @colsSum+' 
             from 
             (
                SELECT up.PreparationID,
                    tt.UserId [CoachId],
                    up.UserID, utm.MemberID, 
                    (ui.FirstName + '' '' + ui.LastName) AS [Rep Name],
                    DateName(Month,nft.MonthPeriodStart) [Month], 
                    sum(nft.Quantity) [Days]
                FROM TransferedTime tt
                INNER JOIN UPreparation up 
                    ON tt.PreparationID = up.PreparationID 
                RIGHT JOIN UTeamMembers utm 
                    ON tt.UserId = utm.CoachID AND utm.MemberID = up.UserID
                INNER JOIN UserInfo ui 
                    ON utm.MemberID = ui.UserID
                LEFT JOIN NonFieldTime nft 
                    ON nft.UserId = tt.UserId 
                    AND tt.MonthPeriodFrom = nft.MonthPeriodStart
                    AND datename(Month,nft.MonthPeriodStart) + ''-''+ substring(datename(Year,nft.MonthPeriodStart),3,2) IN 
                        (SELECT Month +''-'' +substring(datename(Year,MonthDate),3,2) [Months] 
                         FROM [email protected])
                WHERE utm.MemberID IN (SELECT MemberID 
                                        FROM UTeamMembers 
                                        WHERE CoachID = '[email protected]+')
                GROUP BY up.PreparationID,tt.UserId,up.UserID, utm.MemberID,
                (ui.FirstName + '' '' + ui.LastName),DateName(Month,nft.MonthPeriodStart)
            ) x
            pivot 
            (
                sum(Days)
                for Month in (' + @cols + ')
            ) p '

execute(@query)

अस्थायी तालिका का उपयोग करने के बजाय मेरा सुझाव @FiscalMonth एक ऐसी तालिका बनाना है जो इसके लिए स्थायी हो। गतिशील एसक्यूएल का उपयोग करते समय अस्थायी तालिका की बजाय परमिट तालिका के विरुद्ध पूछताछ करना बहुत आसान होगा। अस्थायी तालिका गतिशील क्वेरी के दायरे से बाहर हो सकती है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. तालिका बनाएं में गैर-संकुल अनुक्रमणिका कैसे बनाएं?

  2. किसी मौजूदा कॉलम में एक पहचान जोड़ना

  3. SQL सर्वर (SSMS) में डेटाबेस मेल कैसे सेटअप करें

  4. SQL सर्वर में दी गई तालिका को संदर्भित करने वाली सभी विदेशी कुंजियाँ लौटाएँ

  5. मैं दूसरे कॉलम से परिकलित कॉलम कैसे बनाऊं?