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
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'