1

あなたが完全に理解できるなら、私はあなたにいくつかの深刻な小道具を与えるという巨大な質問があります:

DECLARE @flightDateOrNow DATE = GETDATE()
DECLARE @pilotID INT = 1

SELECT P7.pilotID 
FROM Pilot P7
WHERE location = 'DPG';


SELECT P1.pilotID, BasicInfo.lName, BasicInfo.fName, 
        PilotExamTemp.examType, PilotExamTemp.examDate,

        (CASE
            WHEN EXISTS (SELECT 1 
                         FROM PilotGFRCertification 
                         WHERE pilotID = @pilotID 
                            AND certificationPosition = 'AVO'
                            AND certification = 'TNG')
                AND NOT EXISTS (SELECT 1 
                                 FROM PilotGFRCertification 
                                 WHERE pilotID = @pilotID 
                                    AND certificationPosition = 'AVO'
                                    AND certification = 'AVO')
                THEN 'X'
            ELSE ''
         END) TNG,

         (CASE
            WHEN EXISTS (SELECT 1 
                         FROM PilotGFRCertification 
                         WHERE pilotID = @pilotID 
                            AND certificationPosition = 'AVO'
                            AND certification = 'AVO')
                THEN 'X'
            ELSE ''
         END) AVO,

        (CASE
            WHEN EXISTS (SELECT 1 
                         FROM PilotGFRCertification 
                         WHERE pilotID = @pilotID 
                            AND certificationPosition = 'AVO'
                            AND certification = 'MC')
                THEN 'X'
            ELSE ''
         END) MC,

        (CASE
            WHEN EXISTS (SELECT 1 
                         FROM PilotGFRCertification 
                         WHERE pilotID = @pilotID 
                            AND certificationPosition = 'AVO'
                            AND certification = 'IO')
                THEN 'X'
            ELSE ''
         END) [IO],

        (CASE
            WHEN EXISTS (SELECT 1 
                         FROM PilotGFRCertification 
                         WHERE pilotID = @pilotID 
                            AND certificationPosition = 'AVO'
                            AND certification = 'SO')
                THEN 'X'
            ELSE ''
         END) SO,

         ISNULL((SELECT SUM(P3.flightHours) MCTotal
          FROM PilotLog P3
          WHERE P3.pilotID = P1.pilotID
            AND (flightDate <= P1.flightDate)
            AND topLevelPosition = 'AVO'
            AND dutyStation = 'MC'
         ), 0) MCTotal,

         ISNULL((SELECT SUM(P3.flightHours) AVOTotal
          FROM PilotLog P3
          WHERE P3.pilotID = P1.pilotID
            AND (flightDate <= P1.flightDate)
            AND topLevelPosition = 'AVO'
            AND dutyStation <> 'MC'
         ), 0) AVOTotal,

         (SELECT DATEADD(day, 60, (SELECT TOP 1 flightDate 
                                    FROM PilotLog P3
                                    WHERE P3.flightDate < P1.flightDate
                                        AND P3.topLevelPosition = 'AVO'
                                        AND P3.dutyStation = 'MC'
                                    ORDER BY P3.flightDate DESC))

         ) currency60Day,
         (  
            SELECT COUNT(*) 
            FROM PilotLog P4 
            WHERE P4.pilotID = @pilotID  
                AND topLevelPosition = 'AVO'
                AND sortieGained = 'True'
                AND (P4.flightDate BETWEEN (CASE     
                                           WHEN P1.flightDate > (DATEADD(dd, -DAY(DATEADD(m,1,(DATEADD(dd, -DAY(DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), P1.flightDate) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID))))), DATEADD(m,7,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), P1.flightDate) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID))))))   )), DATEADD(m,7,(DATEADD(dd, -DAY(DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), P1.flightDate) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID))))), DATEADD(m,7,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), P1.flightDate) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID))))))   )))    
                                                THEN (DATEADD(yyyy, 1, (DATEADD(dd,-(DAY(DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), P1.flightDate) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID)))))-1),DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), P1.flightDate) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID)))))) ))    
                                           WHEN P1.flightDate > (DATEADD(dd, -DAY(DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), P1.flightDate) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID))))), DATEADD(m,7,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), P1.flightDate) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID))))))       
                                                THEN (DATEADD(dd,-(DAY(DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), P1.flightDate) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID)))))-1),DATEADD(m,7,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), P1.flightDate) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID))))))        
                                           ELSE (DATEADD(dd,-(DAY(DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), P1.flightDate) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID)))))-1),DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), P1.flightDate) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID))))))    
                                        End) 
                                        AND 
                                        (P1.flightDate))) semiSorties,
        (  
            SELECT SUM(P4.flightHours)
            FROM PilotLog P4 
            WHERE P4.pilotID = @pilotID  
                AND topLevelPosition = 'AVO'
                AND sortieGained = 'True'
                AND (P4.flightDate BETWEEN (CASE     
                                           WHEN P1.flightDate > (DATEADD(dd, -DAY(DATEADD(m,1,(DATEADD(dd, -DAY(DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), P1.flightDate) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID))))), DATEADD(m,7,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), P1.flightDate) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID))))))   )), DATEADD(m,7,(DATEADD(dd, -DAY(DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), P1.flightDate) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID))))), DATEADD(m,7,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), P1.flightDate) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID))))))   )))    
                                                THEN (DATEADD(yyyy, 1, (DATEADD(dd,-(DAY(DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), P1.flightDate) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID)))))-1),DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), P1.flightDate) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID)))))) ))    
                                           WHEN P1.flightDate > (DATEADD(dd, -DAY(DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), P1.flightDate) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID))))), DATEADD(m,7,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), P1.flightDate) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID))))))       
                                                THEN (DATEADD(dd,-(DAY(DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), P1.flightDate) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID)))))-1),DATEADD(m,7,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), P1.flightDate) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID))))))        
                                           ELSE (DATEADD(dd,-(DAY(DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), P1.flightDate) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID)))))-1),DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), P1.flightDate) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID))))))    
                                        End) 
                                        AND 
                                        (P1.flightDate))) semiSortieHours,

        (CASE     
           WHEN @flightDateOrNow > (DATEADD(dd, -DAY(DATEADD(m,1,(DATEADD(dd, -DAY(DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), @flightDateOrNow) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID))))), DATEADD(m,7,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), @flightDateOrNow) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID))))))   )), DATEADD(m,7,(DATEADD(dd, -DAY(DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), @flightDateOrNow) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID))))), DATEADD(m,7,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), @flightDateOrNow) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID))))))   )))    
                THEN (DATEADD(yyyy, 1, (DATEADD(dd, -DAY(DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), @flightDateOrNow) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID))))), DATEADD(m,7,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), @flightDateOrNow) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID))))))   ))    
           WHEN @flightDateOrNow > (DATEADD(dd, -DAY(DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), @flightDateOrNow) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID))))), DATEADD(m,7,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), @flightDateOrNow) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID))))))        
                THEN (DATEADD(dd, -DAY(DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), @flightDateOrNow) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID))))), DATEADD(m,13,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), @flightDateOrNow) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID))))))      
           ELSE (DATEADD(dd, -DAY(DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), @flightDateOrNow) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID))))), DATEADD(m,7,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), @flightDateOrNow) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID))))))      
        End) semiEnd,


        (CASE   
            WHEN @flightDateOrNow > (DATEADD(dd, -DAY(DATEADD(m,1,(DATEADD(yyyy, (DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), @flightDateOrNow)) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID))) )), DATEADD(m,13,(DATEADD(yyyy, (DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), @flightDateOrNow)) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID))) ))) THEN (DATEADD(yyyy, 1, (DATEADD(dd, -DAY(DATEADD(m,1,(DATEADD(yyyy, (DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), @flightDateOrNow)) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID))) )), DATEADD(m,13,(DATEADD(yyyy, (DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), @flightDateOrNow)) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID))) )))))  
            ELSE (DATEADD(dd, -DAY(DATEADD(m,1,(DATEADD(yyyy, (DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), @flightDateOrNow)) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID))) )), DATEADD(m,13,(DATEADD(yyyy, (DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID), @flightDateOrNow)) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = @pilotID))) )))  
        END) annualEnd,

        PMTemp.expirationDate, PMTemp.classFAAMedical


FROM PilotLog P1, Pilot BasicInfo,
        (SELECT DATEADD(dd, -DAY(DATEADD(m,1, medicalDate)), DATEADD(m,13,medicalDate)) expirationDate, classFAAMedical  
         FROM PilotMedical  
         WHERE (pilotID = @pilotID)  
            AND medicalDate = (SELECT MAX(medicalDate) FROM PilotMedical WHERE pilotID = @pilotID)) AS PMTemp,
        (SELECT *
         FROM PilotExam
         WHERE (pilotID = @pilotID)
            AND examPosition = 'AVO'
            AND examDate = (SELECT MAX(examDate) FROM PilotExam WHERE pilotID = @pilotID AND examPosition = 'AVO')) AS PilotExamTemp


WHERE P1.pilotID = @pilotID 
    AND P1.topLevelPosition = 'AVO'
    AND P1.pilotID = BasicInfo.pilotID
    AND P1.flightDate = (SELECT MAX(P5.flightDate) FROM PilotLog P5 WHERE pilotID = @pilotID)
    ORDER BY flightDate DESC

これにより、次の結果が得られます。

pilotID
1
2
3
4
5


pilotID lName   fName   examType    examDate    TNG AVO MC  IO  SO  MCTotal AVOTotal    currency60Day   semiSorties semiSortieHours    semiEnd  annualEnd   expirationDate  classFAAMedical
1       Wilkins Landon  Written     2012-10-11      X   X   X       16.3    7.0          2012-08-14       2         16.7             2012-10-31 2012-10-31  2013-04-30         Third

しかし、私が欲しいのは、これらの各パイロット ID の実際の長い行です。これを行う簡単な方法はありますか?または、SQL を完全に再構築する必要がありますか? (ところで、その SQL の本当に毛むくじゃらの部分は、私がパイロットの半年ごとの開始と終了の期間を把握することです。これは、誕生月に基づいているためです。本当に面倒です)

編集#1:

私は主に次のものを使用しています。

DECLARE @flightDateOrNow DATE = GETDATE()


SELECT P7.pilotID 
FROM Pilot P7
WHERE location = 'DPG';


SELECT DISTINCT BasicInfo.pilotID, BasicInfo.lName, BasicInfo.fName,

        (CASE
            WHEN EXISTS (SELECT 1 
                         FROM PilotGFRCertification 
                         WHERE pilotID = P1.pilotID 
                            AND certificationPosition = 'AVO'
                            AND certification = 'TNG')
                AND NOT EXISTS (SELECT 1 
                                 FROM PilotGFRCertification 
                                 WHERE pilotID = P1.pilotID 
                                    AND certificationPosition = 'AVO'
                                    AND certification = 'AVO')
                THEN 'X'
            ELSE ''
         END) TNG,

         (CASE
            WHEN EXISTS (SELECT 1 
                         FROM PilotGFRCertification 
                         WHERE pilotID = P1.pilotID 
                            AND certificationPosition = 'AVO'
                            AND certification = 'AVO')
                THEN 'X'
            ELSE ''
         END) AVO,

        (CASE
            WHEN EXISTS (SELECT 1 
                         FROM PilotGFRCertification 
                         WHERE pilotID = P1.pilotID 
                            AND certificationPosition = 'AVO'
                            AND certification = 'MC')
                THEN 'X'
            ELSE ''
         END) MC,

        (CASE
            WHEN EXISTS (SELECT 1 
                         FROM PilotGFRCertification 
                         WHERE pilotID = P1.pilotID 
                            AND certificationPosition = 'AVO'
                            AND certification = 'IO')
                THEN 'X'
            ELSE ''
         END) [IO],

        (CASE
            WHEN EXISTS (SELECT 1 
                         FROM PilotGFRCertification 
                         WHERE pilotID = P1.pilotID 
                            AND certificationPosition = 'AVO'
                            AND certification = 'SO')
                THEN 'X'
            ELSE ''
         END) SO,

         ISNULL((SELECT SUM(P3.flightHours) MCTotal
          FROM PilotLog P3
          WHERE P3.pilotID = P1.pilotID
            AND (flightDate <= (SELECT MAX(P5.flightDate) FROM PilotLog P5 WHERE pilotID = P1.pilotID))
            AND topLevelPosition = 'AVO'
            AND dutyStation = 'MC'
         ), 0) MCTotal,

         ISNULL((SELECT SUM(P3.flightHours) AVOTotal
          FROM PilotLog P3
          WHERE P3.pilotID = P1.pilotID
            AND (flightDate <= (SELECT MAX(P5.flightDate) FROM PilotLog P5 WHERE pilotID = P1.pilotID))
            AND topLevelPosition = 'AVO'
            AND dutyStation <> 'MC'
         ), 0) AVOTotal,

         (SELECT DATEADD(day, 60, (SELECT TOP 1 flightDate 
                                    FROM PilotLog P3
                                    WHERE P3.flightDate < (SELECT MAX(P5.flightDate) FROM PilotLog P5 WHERE pilotID = P1.pilotID)
                                        AND P3.topLevelPosition = 'AVO'
                                        AND P3.dutyStation = 'MC'
                                    ORDER BY P3.flightDate DESC))

         ) currency60Day,
         (  
            SELECT COUNT(*) 
            FROM PilotLog P4 
            WHERE P4.pilotID = P1.pilotID  
                AND topLevelPosition = 'AVO'
                AND sortieGained = 'True'
                AND (P4.flightDate BETWEEN (CASE     
                                           WHEN (SELECT MAX(P5.flightDate) FROM PilotLog P5 WHERE pilotID = P1.pilotID) > (DATEADD(dd, -DAY(DATEADD(m,1,(DATEADD(dd, -DAY(DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), (SELECT MAX(P5.flightDate) FROM PilotLog P5 WHERE pilotID = P1.pilotID)) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID))))), DATEADD(m,7,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), (SELECT MAX(P5.flightDate) FROM PilotLog P5 WHERE pilotID = P1.pilotID)) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID))))))   )), DATEADD(m,7,(DATEADD(dd, -DAY(DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), (SELECT MAX(P5.flightDate) FROM PilotLog P5 WHERE pilotID = P1.pilotID)) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID))))), DATEADD(m,7,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), (SELECT MAX(P5.flightDate) FROM PilotLog P5 WHERE pilotID = P1.pilotID)) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID))))))   )))    
                                                THEN (DATEADD(yyyy, 1, (DATEADD(dd,-(DAY(DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), (SELECT MAX(P5.flightDate) FROM PilotLog P5 WHERE pilotID = P1.pilotID)) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID)))))-1),DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), (SELECT MAX(P5.flightDate) FROM PilotLog P5 WHERE pilotID = P1.pilotID)) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID)))))) ))    
                                           WHEN (SELECT MAX(P5.flightDate) FROM PilotLog P5 WHERE pilotID = P1.pilotID) > (DATEADD(dd, -DAY(DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), (SELECT MAX(P5.flightDate) FROM PilotLog P5 WHERE pilotID = P1.pilotID)) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID))))), DATEADD(m,7,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), (SELECT MAX(P5.flightDate) FROM PilotLog P5 WHERE pilotID = P1.pilotID)) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID))))))       
                                                THEN (DATEADD(dd,-(DAY(DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), (SELECT MAX(P5.flightDate) FROM PilotLog P5 WHERE pilotID = P1.pilotID)) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID)))))-1),DATEADD(m,7,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), (SELECT MAX(P5.flightDate) FROM PilotLog P5 WHERE pilotID = P1.pilotID)) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID))))))        
                                           ELSE (DATEADD(dd,-(DAY(DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), (SELECT MAX(P5.flightDate) FROM PilotLog P5 WHERE pilotID = P1.pilotID)) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID)))))-1),DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), (SELECT MAX(P5.flightDate) FROM PilotLog P5 WHERE pilotID = P1.pilotID)) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID))))))    
                                        End) 
                                        AND 
                                        ((SELECT MAX(P5.flightDate) FROM PilotLog P5 WHERE pilotID = P1.pilotID)))) semiSorties,
        (  
            SELECT SUM(P4.flightHours)
            FROM PilotLog P4 
            WHERE P4.pilotID = P1.pilotID  
                AND topLevelPosition = 'AVO'
                AND sortieGained = 'True'
                AND (P4.flightDate BETWEEN (CASE     
                                           WHEN (SELECT MAX(P5.flightDate) FROM PilotLog P5 WHERE pilotID = P1.pilotID) > (DATEADD(dd, -DAY(DATEADD(m,1,(DATEADD(dd, -DAY(DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), (SELECT MAX(P5.flightDate) FROM PilotLog P5 WHERE pilotID = P1.pilotID)) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID))))), DATEADD(m,7,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), (SELECT MAX(P5.flightDate) FROM PilotLog P5 WHERE pilotID = P1.pilotID)) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID))))))   )), DATEADD(m,7,(DATEADD(dd, -DAY(DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), (SELECT MAX(P5.flightDate) FROM PilotLog P5 WHERE pilotID = P1.pilotID)) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID))))), DATEADD(m,7,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), (SELECT MAX(P5.flightDate) FROM PilotLog P5 WHERE pilotID = P1.pilotID)) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID))))))   )))    
                                                THEN (DATEADD(yyyy, 1, (DATEADD(dd,-(DAY(DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), (SELECT MAX(P5.flightDate) FROM PilotLog P5 WHERE pilotID = P1.pilotID)) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID)))))-1),DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), (SELECT MAX(P5.flightDate) FROM PilotLog P5 WHERE pilotID = P1.pilotID)) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID)))))) ))    
                                           WHEN (SELECT MAX(P5.flightDate) FROM PilotLog P5 WHERE pilotID = P1.pilotID) > (DATEADD(dd, -DAY(DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), (SELECT MAX(P5.flightDate) FROM PilotLog P5 WHERE pilotID = P1.pilotID)) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID))))), DATEADD(m,7,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), (SELECT MAX(P5.flightDate) FROM PilotLog P5 WHERE pilotID = P1.pilotID)) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID))))))       
                                                THEN (DATEADD(dd,-(DAY(DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), (SELECT MAX(P5.flightDate) FROM PilotLog P5 WHERE pilotID = P1.pilotID)) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID)))))-1),DATEADD(m,7,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), (SELECT MAX(P5.flightDate) FROM PilotLog P5 WHERE pilotID = P1.pilotID)) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID))))))        
                                           ELSE (DATEADD(dd,-(DAY(DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), (SELECT MAX(P5.flightDate) FROM PilotLog P5 WHERE pilotID = P1.pilotID)) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID)))))-1),DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), (SELECT MAX(P5.flightDate) FROM PilotLog P5 WHERE pilotID = P1.pilotID)) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID))))))    
                                        End) 
                                        AND 
                                        ((SELECT MAX(P5.flightDate) FROM PilotLog P5 WHERE pilotID = P1.pilotID)))) semiSortieHours,

        (CASE     
           WHEN @flightDateOrNow > (DATEADD(dd, -DAY(DATEADD(m,1,(DATEADD(dd, -DAY(DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), @flightDateOrNow) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID))))), DATEADD(m,7,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), @flightDateOrNow) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID))))))   )), DATEADD(m,7,(DATEADD(dd, -DAY(DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), @flightDateOrNow) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID))))), DATEADD(m,7,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), @flightDateOrNow) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID))))))   )))    
                THEN (DATEADD(yyyy, 1, (DATEADD(dd, -DAY(DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), @flightDateOrNow) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID))))), DATEADD(m,7,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), @flightDateOrNow) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID))))))   ))    
           WHEN @flightDateOrNow > (DATEADD(dd, -DAY(DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), @flightDateOrNow) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID))))), DATEADD(m,7,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), @flightDateOrNow) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID))))))        
                THEN (DATEADD(dd, -DAY(DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), @flightDateOrNow) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID))))), DATEADD(m,13,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), @flightDateOrNow) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID))))))      
           ELSE (DATEADD(dd, -DAY(DATEADD(m,1,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), @flightDateOrNow) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID))))), DATEADD(m,7,(DATEADD(yyyy, DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), @flightDateOrNow) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID))))))      
        End) semiEnd,


        (CASE   
            WHEN @flightDateOrNow > (DATEADD(dd, -DAY(DATEADD(m,1,(DATEADD(yyyy, (DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), @flightDateOrNow)) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID))) )), DATEADD(m,13,(DATEADD(yyyy, (DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), @flightDateOrNow)) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID))) ))) THEN (DATEADD(yyyy, 1, (DATEADD(dd, -DAY(DATEADD(m,1,(DATEADD(yyyy, (DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), @flightDateOrNow)) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID))) )), DATEADD(m,13,(DATEADD(yyyy, (DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), @flightDateOrNow)) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID))) )))))  
            ELSE (DATEADD(dd, -DAY(DATEADD(m,1,(DATEADD(yyyy, (DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), @flightDateOrNow)) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID))) )), DATEADD(m,13,(DATEADD(yyyy, (DATEDIFF(yy, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID), @flightDateOrNow)) - 1, (SELECT birthDate FROM Pilot WHERE pilotID = P1.pilotID))) )))  
        END) annualEnd



FROM PilotLog P1
FULL JOIN Pilot BasicInfo
    ON P1.pilotID = BasicInfo.pilotID

WHERE 
    BasicInfo.location = 'DPG'

次にスキーマについて(アップロードの過程で、これまでにいくつかのテーブルがあります)

パイロット パイロットテーブル

パイロットログ ここに画像の説明を入力

パイロット試験 ここに画像の説明を入力

パイロットGFRC認定 ここに画像の説明を入力

パイロット医療 ここに画像の説明を入力

4

2 に答える 2

2

あなたはこのようなことをすることができます:

  • 処理するパイロットIDを保持するテーブル変数を定義します

    DECLARE @PilotIDs TABLE (PilotID INT)
    
    INSERT INTO @PilotIDs 
       SELECT P7.pilotID 
       FROM Pilot P7
       WHERE location = 'DPG';
    
  • 最初に(選択する列のリストで)、この状態が数回発生します。

    WHERE pilotID = @pilotID  
    

    これを次のように置き換えます。

    WHERE pilotID = P1.PilotID
    
  • クエリの残りの部分はそのままにしておきます-最後に、次のようないくつかの条件があります

    WHERE P1.pilotID = @pilotID 
    

    それらを次のように変更します。

    WHERE P1.pilotID IN (SELECT PilotID FROM @PilotIDs)
    

そして、それ基本的にそれの世話をする必要があります-私は願っています!これはクエリの本当に大きな巨大な醜いモンスターです...QueryZillaの途中で何も壊れないことを願っています......

于 2012-07-24T15:48:17.087 に答える
1

一見すると、最後のSELECTステートメントを次の2つの変更で変更すると、探している結果が得られるはずです。

  1. のすべてのインスタンス@pilotIDP1.PilotID
  2. WHEREの句を削除しますP1.pilotID = @pilotID

ただし、全体的なスキーマを確認したいのですが、これは、代わりにいくつかのルックアップテーブルとJOINを利用して、少し短いクエリとして記述できるように見えるためです。

于 2012-07-24T15:48:38.663 に答える