2013-09-30 3 views
0

Je travaille sur une requête long et complexe:Ajout conditionals à une UNION

DECLARE @userParam VARCHAR(100) 
    ,@startDateParam DATETIME 
    ,@endDateParam DATETIME 
    ,@orgTeamPK VARCHAR(100) 
    ,@teamId VARCHAR(100) 
    ,@productId VARCHAR(100) 

SET @userParam = '%' 
SET @startDateParam = '2013-09-02 00:00:00' 
SET @endDateParam = '2013-09-08 00:00:00' 
SET @orgTeamPK = '%' 
SET @teamId = '%' 
SET @productId = '%' 

SELECT '3' AS RowType 
    ,DTH.PointPerson AS Person 
    ,'' AS [Status] 
    ,'' AS OrganizationalTeam 
    ,'' AS Project 
    ,'' AS Sprint 
    ,'' AS Story 
    ,'Subtotal:' AS Task 
    ,CAST(SUM(CASE 
       WHEN DATEPART(dw, DTH.ActivityDate) = 2 
        THEN DTH.[Hours] 
       ELSE 0 
       END) AS VARCHAR(20)) AS MondayHours 
    ,CAST(SUM(CASE 
       WHEN DATEPART(dw, DTH.ActivityDate) = 3 
        THEN DTH.[Hours] 
       ELSE 0 
       END) AS VARCHAR(20)) AS TuesdayHours 
    ,CAST(SUM(CASE 
       WHEN DATEPART(dw, DTH.ActivityDate) = 4 
        THEN DTH.[Hours] 
       ELSE 0 
       END) AS VARCHAR(20)) AS WednesdayHours 
    ,CAST(SUM(CASE 
       WHEN DATEPART(dw, DTH.ActivityDate) = 5 
        THEN DTH.[Hours] 
       ELSE 0 
       END) AS VARCHAR(20)) AS ThursdayHours 
    ,CAST(SUM(CASE 
       WHEN DATEPART(dw, DTH.ActivityDate) = 6 
        THEN DTH.[Hours] 
       ELSE 0 
       END) AS VARCHAR(20)) AS FridayHours 
    ,CAST(SUM(CASE 
       WHEN DATEPART(dw, DTH.ActivityDate) = 7 
        THEN DTH.[Hours] 
       ELSE 0 
       END) AS VARCHAR(20)) AS SaturdayHours 
    ,CAST(SUM(CASE 
       WHEN DATEPART(dw, DTH.ActivityDate) = 1 
        THEN DTH.[Hours] 
       ELSE 0 
       END) AS VARCHAR(20)) AS SundayHours 
    ,CAST(SUM(DTH.[Hours]) AS VARCHAR(20)) AS TotalHours 
FROM DailyTaskHours DTH 
LEFT JOIN Task TSK ON DTH.TaskId = TSK.PK_Task 
LEFT JOIN Story STY ON TSK.StoryId = STY.PK_Story 
LEFT JOIN NonScrumStory NSS ON DTH.NonScrumStoryId = NSS.PK_NonScrumStory 
LEFT JOIN Sprint SPT ON STY.SprintId = SPT.PK_Sprint 
LEFT JOIN Product PDT ON STY.ProductId = PDT.PK_Product 
LEFT JOIN ProductTeamUser PTU ON TSK.ProductTeamUserId = PTU.PK_ProductTeamUser 
LEFT JOIN [User] USR ON PTU.UserId = USR.PK_User 
LEFT JOIN OrganizationalTeam OLT ON USR.OrganizationalTeamId = OLT.PK_OrganizationalTeam 
LEFT JOIN UserAuthorization UAN2 ON (PDT.PK_Product = UAN2.ProductId AND UAN2.Deleted IS NULL) 
WHERE DTH.PointPerson LIKE @userParam 
    AND ActivityDate >= @startDateParam 
    AND ActivityDate <= @endDateParam 
    AND COALESCE(OLT.PK_OrganizationalTeam,'') LIKE @orgTeamPK 
    AND UAN2.ProductId LIKE @productId 
GROUP BY DTH.PointPerson 
HAVING SUM(DTH.[Hours]) > 0 
) AS My_View 
-- 

UNION 

-- 
SELECT '3' AS RowType 
    ,DTH.PointPerson AS Person 
    ,'' AS [Status] 
    ,'' AS OrganizationalTeam 
    ,'' AS Project 
    ,'' AS Sprint 
    ,'' AS Story 
    ,'Subtotal:' AS Task 
    ,CAST(SUM(CASE 
       WHEN DATEPART(dw, DTH.ActivityDate) = 2 
        THEN DTH.[Hours] 
       ELSE 0 
       END) AS VARCHAR(20)) AS MondayHours 
    ,CAST(SUM(CASE 
       WHEN DATEPART(dw, DTH.ActivityDate) = 3 
        THEN DTH.[Hours] 
       ELSE 0 
       END) AS VARCHAR(20)) AS TuesdayHours 
    ,CAST(SUM(CASE 
       WHEN DATEPART(dw, DTH.ActivityDate) = 4 
        THEN DTH.[Hours] 
       ELSE 0 
       END) AS VARCHAR(20)) AS WednesdayHours 
    ,CAST(SUM(CASE 
       WHEN DATEPART(dw, DTH.ActivityDate) = 5 
        THEN DTH.[Hours] 
       ELSE 0 
       END) AS VARCHAR(20)) AS ThursdayHours 
    ,CAST(SUM(CASE 
       WHEN DATEPART(dw, DTH.ActivityDate) = 6 
        THEN DTH.[Hours] 
       ELSE 0 
       END) AS VARCHAR(20)) AS FridayHours 
    ,CAST(SUM(CASE 
       WHEN DATEPART(dw, DTH.ActivityDate) = 7 
        THEN DTH.[Hours] 
       ELSE 0 
       END) AS VARCHAR(20)) AS SaturdayHours 
    ,CAST(SUM(CASE 
       WHEN DATEPART(dw, DTH.ActivityDate) = 1 
        THEN DTH.[Hours] 
       ELSE 0 
       END) AS VARCHAR(20)) AS SundayHours 
    ,CAST(SUM(DTH.[Hours]) AS VARCHAR(20)) AS TotalHours 
FROM DailyTaskHours DTH 
LEFT JOIN Task TSK ON DTH.TaskId = TSK.PK_Task 
LEFT JOIN Story STY ON TSK.StoryId = STY.PK_Story 
LEFT JOIN NonScrumStory NSS ON DTH.NonScrumStoryId = NSS.PK_NonScrumStory 
LEFT JOIN Sprint SPT ON STY.SprintId = SPT.PK_Sprint 
LEFT JOIN Product PDT ON STY.ProductId = PDT.PK_Product 
LEFT JOIN ProductTeamUser PTU ON TSK.ProductTeamUserId = PTU.PK_ProductTeamUser 
LEFT JOIN [User] USR ON PTU.UserId = USR.PK_User 
LEFT JOIN OrganizationalTeam OLT ON USR.OrganizationalTeamId = OLT.PK_OrganizationalTeam 
LEFT JOIN UserAuthorization UAN1 ON (USR.PK_User = UAN1.UserId AND UAN1.Deleted IS NULL) 
WHERE DTH.PointPerson LIKE @userParam 
    AND ActivityDate >= @startDateParam 
    AND ActivityDate <= @endDateParam 
    AND COALESCE(OLT.PK_OrganizationalTeam,'') LIKE @orgTeamPK 
    AND UAN1.OrganizationalTeamId LIKE @teamId 
GROUP BY DTH.PointPerson 
HAVING SUM(DTH.[Hours]) > 0 

Il y a deux lignes qui peuvent être générés et mis en rowtype 3. Ils ont une union entre eux afin que les deux résultats seront affichés et mais les doublons ne le feront pas. Cela fonctionne comme prévu, mais il y a des cas que parce que toutes les cellules ne s'ajoutent pas entre les lignes, il montre deux versions de la ligne. Si cela se produit, je veux juste montrer la ligne là, la dernière cellule est plus grande (colonne Total).

Comment puis-je y parvenir?

Modifier (pour tenter de clarifier):

J'ai une union qui se traduit parfois en deux lignes pour la même personne:

Si cela se produit, je veux juste montrer la ligne avec le total supérieur à la place des deux. Comment je fais ça? enter image description here

Edit2:

Mise à jour avec des suggestions .. encore avoir les mêmes résultats. Qu'est-ce qui ne va pas?

SELECT RowType 
    ,Person 
    ,[Status] 
    ,OrganizationalTeam 
    ,Project 
    ,Sprint 
    ,Story 
    ,[Task] 
    ,MondayHours 
    ,TuesdayHours 
    ,WednesdayHours 
    ,ThursdayHours 
    ,FridayHours 
    ,SaturdayHours 
    ,SundayHours 
    ,MAX(DerivedTable.TotalHours) 
    FROM (
    SELECT '3' AS RowType 
     ,DTH.PointPerson AS Person 
     ,'' AS [Status] 
     ,'' AS OrganizationalTeam 
     ,'' AS Project 
     ,'' AS Sprint 
     ,'' AS Story 
     ,'Subtotal:' AS Task 
     ,CAST(SUM(CASE 
        WHEN DATEPART(dw, DTH.ActivityDate) = 2 
         THEN DTH.[Hours] 
        ELSE 0 
        END) AS VARCHAR(20)) AS MondayHours 
     ,CAST(SUM(CASE 
        WHEN DATEPART(dw, DTH.ActivityDate) = 3 
         THEN DTH.[Hours] 
        ELSE 0 
        END) AS VARCHAR(20)) AS TuesdayHours 
     ,CAST(SUM(CASE 
        WHEN DATEPART(dw, DTH.ActivityDate) = 4 
         THEN DTH.[Hours] 
        ELSE 0 
        END) AS VARCHAR(20)) AS WednesdayHours 
     ,CAST(SUM(CASE 
        WHEN DATEPART(dw, DTH.ActivityDate) = 5 
         THEN DTH.[Hours] 
        ELSE 0 
        END) AS VARCHAR(20)) AS ThursdayHours 
     ,CAST(SUM(CASE 
        WHEN DATEPART(dw, DTH.ActivityDate) = 6 
         THEN DTH.[Hours] 
        ELSE 0 
        END) AS VARCHAR(20)) AS FridayHours 
     ,CAST(SUM(CASE 
        WHEN DATEPART(dw, DTH.ActivityDate) = 7 
         THEN DTH.[Hours] 
        ELSE 0 
        END) AS VARCHAR(20)) AS SaturdayHours 
     ,CAST(SUM(CASE 
        WHEN DATEPART(dw, DTH.ActivityDate) = 1 
         THEN DTH.[Hours] 
        ELSE 0 
        END) AS VARCHAR(20)) AS SundayHours 
     ,CAST(SUM(DTH.[Hours]) AS VARCHAR(20)) AS TotalHours 
    FROM DailyTaskHours DTH 
    LEFT JOIN Task TSK ON DTH.TaskId = TSK.PK_Task 
    LEFT JOIN Story STY ON TSK.StoryId = STY.PK_Story 
    LEFT JOIN NonScrumStory NSS ON DTH.NonScrumStoryId = NSS.PK_NonScrumStory 
    LEFT JOIN Sprint SPT ON STY.SprintId = SPT.PK_Sprint 
    LEFT JOIN Product PDT ON STY.ProductId = PDT.PK_Product 
    LEFT JOIN ProductTeamUser PTU ON TSK.ProductTeamUserId = PTU.PK_ProductTeamUser 
    LEFT JOIN [User] USR ON PTU.UserId = USR.PK_User 
    LEFT JOIN OrganizationalTeam OLT ON USR.OrganizationalTeamId = OLT.PK_OrganizationalTeam 
    LEFT JOIN UserAuthorization UAN2 ON (
      PDT.PK_Product = UAN2.ProductId 
      AND UAN2.Deleted IS NULL 
      ) 
    WHERE DTH.PointPerson LIKE @userParam 
     AND ActivityDate >= @startDateParam 
     AND ActivityDate <= @endDateParam 
     AND COALESCE(OLT.PK_OrganizationalTeam, '') LIKE @orgTeamPK 
     AND UAN2.ProductId LIKE @productId 
    GROUP BY DTH.PointPerson 
    HAVING SUM(DTH.[Hours]) > 0 
    -- 

    UNION 

    -- 
    SELECT '3' AS RowType 
     ,DTH.PointPerson AS Person 
     ,'' AS [Status] 
     ,'' AS OrganizationalTeam 
     ,'' AS Project 
     ,'' AS Sprint 
     ,'' AS Story 
     ,'Subtotal:' AS Task 
     ,CAST(SUM(CASE 
        WHEN DATEPART(dw, DTH.ActivityDate) = 2 
         THEN DTH.[Hours] 
        ELSE 0 
        END) AS VARCHAR(20)) AS MondayHours 
     ,CAST(SUM(CASE 
        WHEN DATEPART(dw, DTH.ActivityDate) = 3 
         THEN DTH.[Hours] 
        ELSE 0 
        END) AS VARCHAR(20)) AS TuesdayHours 
     ,CAST(SUM(CASE 
        WHEN DATEPART(dw, DTH.ActivityDate) = 4 
         THEN DTH.[Hours] 
        ELSE 0 
        END) AS VARCHAR(20)) AS WednesdayHours 
     ,CAST(SUM(CASE 
        WHEN DATEPART(dw, DTH.ActivityDate) = 5 
         THEN DTH.[Hours] 
        ELSE 0 
        END) AS VARCHAR(20)) AS ThursdayHours 
     ,CAST(SUM(CASE 
        WHEN DATEPART(dw, DTH.ActivityDate) = 6 
         THEN DTH.[Hours] 
        ELSE 0 
        END) AS VARCHAR(20)) AS FridayHours 
     ,CAST(SUM(CASE 
        WHEN DATEPART(dw, DTH.ActivityDate) = 7 
         THEN DTH.[Hours] 
        ELSE 0 
        END) AS VARCHAR(20)) AS SaturdayHours 
     ,CAST(SUM(CASE 
        WHEN DATEPART(dw, DTH.ActivityDate) = 1 
         THEN DTH.[Hours] 
        ELSE 0 
        END) AS VARCHAR(20)) AS SundayHours 
     ,CAST(SUM(DTH.[Hours]) AS VARCHAR(20)) AS TotalHours 
    FROM DailyTaskHours DTH 
    LEFT JOIN Task TSK ON DTH.TaskId = TSK.PK_Task 
    LEFT JOIN Story STY ON TSK.StoryId = STY.PK_Story 
    LEFT JOIN NonScrumStory NSS ON DTH.NonScrumStoryId = NSS.PK_NonScrumStory 
    LEFT JOIN Sprint SPT ON STY.SprintId = SPT.PK_Sprint 
    LEFT JOIN Product PDT ON STY.ProductId = PDT.PK_Product 
    LEFT JOIN ProductTeamUser PTU ON TSK.ProductTeamUserId = PTU.PK_ProductTeamUser 
    LEFT JOIN [User] USR ON PTU.UserId = USR.PK_User 
    LEFT JOIN OrganizationalTeam OLT ON USR.OrganizationalTeamId = OLT.PK_OrganizationalTeam 
    LEFT JOIN UserAuthorization UAN1 ON (
      USR.PK_User = UAN1.UserId 
      AND UAN1.Deleted IS NULL 
      ) 
    WHERE DTH.PointPerson LIKE @userParam 
     AND ActivityDate >= @startDateParam 
     AND ActivityDate <= @endDateParam 
     AND COALESCE(OLT.PK_OrganizationalTeam, '') LIKE @orgTeamPK 
     AND UAN1.OrganizationalTeamId LIKE @teamId 
    GROUP BY DTH.PointPerson 
    HAVING SUM(DTH.[Hours]) > 0 
    ) AS DerivedTable 
     GROUP BY 
     DerivedTable.RowType, 
     DerivedTable.Person, 
     DerivedTable.[Status], 
     DerivedTable.OrganizationalTeam, 
     DerivedTable.Project, 
     DerivedTable.Sprint, 
     DerivedTable.Story, 
     DerivedTable.[Task], 
     DerivedTable.MondayHours, 
     DerivedTable.TuesdayHours, 
     DerivedTable.WednesdayHours, 
     DerivedTable.ThursdayHours, 
     DerivedTable.FridayHours, 
     DerivedTable.SaturdayHours, 
     DerivedTable.SundayHours, 
      DerivedTable.TotalHours 
+0

Faites de cette table entière une table dérivée et sélectionnez des valeurs max. –

+0

Comment faites-vous cela? –

+1

Une table dérivée est une sous-requête avec un alias. Voici un exemple simple, sélectionnez enregistrement dans (sélectionnez 1 enregistrement) x. x, est une table dérivée. –

Répondre

1

Et vous envelopper les requêtes syndicales dans une requête externe, puis utilisez un agrégat pour obtenir la colonne totale supérieure comme celui-ci (simplifié par souci de concision):

SELECT a.COL1, a.COL2, MAX(a.TOTAL) AS Total 
FROM 
(
    SELECT COL1, COL2, TOTAL 
    FROM TABLE1 
    ... 

    UNION ALL 

    SELECT COL1, COL2, TOTAL  
    FROM TABLE2 
    ... 
) a 

GROUP BY a.COL1 , a.COL2

vous pouvez également utiliser des fonctions d'agrégation supplémentaires MIN/MAX pour d'autres colonnes où vous attendez doublons, et vous pouvez même mélanger ces déclarations avec CASE pour des scénarios plus complexes.

+0

J'ai pris cette approche. Les résultats sont les mêmes. Je mettrai à jour mon message original avec la mise à jour. –

+0

Je ne pense pas que vous vouliez 'DerivedTable.TotalHours' dans votre clause de regroupement parce que c'est la colonne sur laquelle vous êtes en train d'agréger dans la requête externe. Cela fait-il une différence? – James

+0

Ne pas grouper. Au lieu de cela, ajoutez un champ comme RANK() OVER (partition BY Personne ORDER BY TotalHours desc) AS Total_rank, puis filtrez pour '1'. –