2017-10-19 19 views
0

Je souhaite afficher le nombre de lignes mises à jour affectées par le code suivant;Affichage du résultat d'une mise à jour basée sur une instruction case

UPDATE [document] 
SET CalculatedTime = CASE WHEN DATEPART(hh, PrimaryDate) < 9 
          THEN 'Pre-9AM' 
          ELSE CASE WHEN datepart(hh, PrimaryDate) >= 9 AND datepart(hh, PrimaryDate) <= 18 
              THEN 'Between 9AM-6AM' 
              ELSE CASE WHEN datepart(hh, PrimaryDate) > 18 
                 THEN 'Post-6PM' 
                 ELSE '' 
               END 
            END 
        END 

La sortie doit être:

TimeCalculation Count 
--------------------- 
Pre-9AM   10 
Between 9AM-6AM 583 
Post-6PM   0 

Toute aide est appréciée!

+0

Il n'est pas nécessaire d'imbriquer les expressions de casse. Un seul cas suffit. – jarlh

Répondre

2

tout d'abord il n'y a pas besoin d'imbriqué CASE

update [document] 
SET CalculatedTime = 
     case when DATEPART(hh,PrimaryDate) < 9 then 'Pre-9AM' 
      when datepart(hh,PrimaryDate) >= 9 
       AND datepart(hh,PrimaryDate) <= 18 then 'Between 9AM-6AM' 
      when datepart(hh,PrimaryDate) > 18 then 'Post-6PM' 
      else '' 
     end ; 

Deuxièmement, si vous voulez compter pour chaque cas, vous pouvez utiliser:

SELECT CalculatedTime, COUNT(*) 
FROM [document] 
GROUP BY CalculatedTime; 

Il fonctionnera parce que vous mettez à jour toute la table.


En utilisant MERGE:

SELECT CalculatedTime, COUNT(*) AS count 
FROM (
MERGE [document] trg 
USING (SELECT 1 AS c) src 
    ON trg.id = trg.id 
WHEN MACHED THEN 
    UPDATE SET CalculatedTime = 
     case when DATEPART(hh,PrimaryDate) < 9 then 'Pre-9AM' 
      when datepart(hh,PrimaryDate) >= 9 
       AND datepart(hh,PrimaryDate) <= 18 then 'Between 9AM-6AM' 
      when datepart(hh,PrimaryDate) > 18 then 'Post-6PM' 
      else '' 
     end 
OUTPUT $action, inserted.CalculatedTime 
) s(action, CalculatedTime) 
WHERE action = 'UPDATE' 
GROUP BY CalculatedTime 
0

Vous pouvez utiliser la sortie UPDATE dans une table.

Declare @document table (CalculatedTime varchar(50)); 

    UPDATE [document] 
     SET CalculatedTime = 
       Case when DATEPART(hh,PrimaryDate) < 9 then 'Pre-9AM' 
        when datepart(hh,PrimaryDate) >= 9 
         AND datepart(hh,PrimaryDate) <= 18 then 'Between 9AM-6AM' 
        when datepart(hh,PrimaryDate) > 18 then 'Post-6PM' 
        else '' 
       End 
      OUTPUT INSERTED.CalculatedTime INTO @document 

    SELECT CalculatedTime as TimeCalculation, COUNT(*) as Count 
     FROM @document 
      GROUP BY CalculatedTime;