Résultat de la requête SUM contenant UNION ALL et CTE

Même si j'ai trouvé quelque chose de similaire à ce dont j'avais besoin, je n'ai pas pu me débrouiller.

Donc, je vais requestr à mon exemple.

(C'est en continuation à ma question précédente: select s'il y a plus de n résultats mais avec des conditions )

Ma table:


 |  TimeId |  Work_Role |  Nom d'user |
 ----------------------------------
 |  1 |  users |  Oran | 
 |  2 |  admin |  Ray |
 |  3 |  users |  Oran | 
 |  4 |  servs |  Amit |
 |  5 |  admin |  Oran |
 |  6 |  users |  Ray |
 |  7 |  users |  Oran | 
 |  8 |  servs |  Amit |
 |  9 |  admin |  Oran |
 |  10 |  users |  Oran | 

J'ai utilisé CTE pour afficher une list pour user_name = "Oran" et Work_Role = "users" UNIQUEMENT s'il y en a plus de 2 dans la table.

En outre, j'ai utilisé Union tous pour rassembler une autre partie que sa condition est: user_name = "Oran" et Work_Role = "admin".

Le résultat est:

 |  TimeId |  Work_Role |  Nom d'user |
 ----------------------------------
 |  1 |  users |  Oran | 
 |  3 |  users |  Oran | 
 |  7 |  users |  Oran | 
 |  10 |  users |  Oran |
 |  5 |  admin |  Oran | 
 |  9 |  admin |  Oran |

Ma deuxième partie (où j'ai le problème) est de countr combien de lignes le résultat ci-dessus a.

Dans ce cas je m'attends à: 6

Mon code pour le premier résultat (qui fonctionne bien):

WITH CTE AS( SELECT *, cc = COUNT(*) OVER(PARTITION BY User_Name) FROM Table ) SELECT * FROM CTE WHERE Work_Role = 'users' AND User_Name = 'Oran' AND cc > 2 UNION ALL SELECT * FROM TABLE WHERE Work_Role = 'admin' AND User_Name = 'Oran' 

Comment puis-je résumer le numéro des lignes du résultat final?

Peut-il même être fait en utilisant CTE?

NOTE: Ceci est juste un exemple. Dans mon vrai code je dois utiliser le "UNION ALL" 🙁

10X!

Tout d'abord, vous pouvez simplifier la requête pour:

 WITH CTE AS ( SELECT t.*, cc = COUNT(*) OVER(PARTITION BY User_Name) FROM Table t ) SELECT * FROM CTE WHERE (Work_Role = 'users' AND User_Name = 'Oran' AND cc > 2) OR (Work_Role = 'admin' AND User_Name = 'Oran'); 

La bonne chose est que cela fonctionnera aussi, parce que les deux sous-requêtes ont les mêmes colonnes.

Si vous voulez countr le nombre de lignes, utilisez simplement select count(*) :

 WITH CTE AS ( SELECT t.*, cc = COUNT(*) OVER(PARTITION BY User_Name) FROM Table t ) SELECT COUNT(*) FROM CTE WHERE (Work_Role = 'users' AND User_Name = 'Oran' AND cc > 2) OR (Work_Role = 'admin' AND User_Name = 'Oran'); 

Ok, j'ai finalement trouvé une réponse, lol

Il est basé sur la première réponse de cette question: Sum a union query

  1. Je devais alias ma table dérivée.
  2. Réglez la sélection supplémentaire (avec le SUM) entre le "THIS" et c'est "SELECT".
  3. Passez à COUNT pour chaque requête et alias.

Ainsi:

 WITH CTE AS( SELECT *, cc = COUNT(*) OVER(PARTITION BY User_Name) FROM Table ) SELECT SUM(my_dervied_table.total_lines) FROM ( SELECT COUNT(*) as 'total_lines' FROM CTE WHERE Work_Role = 'users' AND User_Name = 'Oran' AND cc > 2 UNION ALL SELECT COUNT(*) as 'total_lines' FROM TABLE WHERE Work_Role = 'admin' AND User_Name = 'Oran' ) my_dervied_table 

Donc, au lieu de countr les lignes dans cette sortie:

 |  TimeId |  Work_Role |  Nom d'user |
 ----------------------------------
 |  1 |  users |  Oran | 
 |  3 |  users |  Oran | 
 |  7 |  users |  Oran | 
 |  10 |  users |  Oran |
 |  5 |  admin |  Oran | 
 |  9 |  admin |  Oran |

Je suis en train de sumr le contenu de la colonne 'total_lines' de la table "my_derived_table": 4 + 2 = 6

     |  total_lines |
     ---------------
  1) |  4 |
  2) |  2 |


shalom yael-essayez ce code-

  WITH CTE AS ( SELECT * FROM tbl WHERE Work_Role = 'users' AND User_Name = 'Oran' AND ( select COUNT(user_name) FROM tbl WHERE user_name='oran') > 2 UNION ALL SELECT * FROM tbl WHERE Work_Role = 'admin' AND User_Name = 'Oran') SELECT count([User_Name]) total_lines from cte GROUP BY [Work_Role],[User_Name] 

Vous cherchez cela,

 Declare @t table(TimeId int,Work_Role varchar(50),User_Names varchar(50)) insert into @t values (1 , 'users','Oran' ), ( 2 ,'admin', 'Ray'), ( 3 ,'users', 'Oran'), ( 4,'servs', 'Amit'), ( 5,'admin', 'Oran'), ( 6,'users', 'Ray'), ( 7,'users', 'Oran'), ( 8,'servs', 'Amit'), ( 9,'admin', 'Oran'), ( 10,'users', 'Oran') ;With CTE as ( select *, ROW_NUMBER()over(partition by User_Names,Work_Role order by timeid)rn from @t ) select * from CTE where Work_Role = 'users' AND User_Names = 'Oran' AND exists ( select User_Names from CTE where rn>2 and Work_Role = 'users' AND User_Names = 'Oran' ) UNION ALL select * from CTE where Work_Role = 'admin' AND User_Names = 'Oran'