即使我找到了类似于我所需要的东西,但我还是无法解决这个问题。
所以,我会问我的例子。
(继续我的上一个问题:select if there are more than n results but with conditions)
我的表:
| TimeId | Work_Role | User_Name | ---------------------------------- | 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 |
我已经使用CTE显示了user_name =" Oran"的列表。和Work_Role ="用户"只要表格中有超过2个。
此外,我使用Union all来收集另一部分,其条件是:user_name =" Oran"和Work_Role =" admin"。
结果是:
| TimeId | Work_Role | User_Name | ---------------------------------- | 1 | users | Oran | | 3 | users | Oran | | 7 | users | Oran | | 10 | users | Oran | | 5 | admin | Oran | | 9 | admin | Oran |
我的第二部分(我有问题)是计算上面结果有多少行。
在这种情况下,我希望:6
我的第一个结果的代码(工作正常):
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'
我如何总结这些行'最终结果的数量?
使用CTE时是否可以完成?
注意: 这只是一个例子。在我的真实代码中,我必须使用" UNION ALL" : - (
10X!
答案 0 :(得分:0)
首先,您可以将查询简化为:
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');
好处是它也可以工作,因为这两个子查询具有相同的列。
如果您想计算行数,请使用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');
答案 1 :(得分:0)
好的,最终我找到了答案,哈哈,
这是基于这个问题的第一个答案:Sum a union query
像这样:
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
所以不要计算此输出中的行:
| TimeId | Work_Role | User_Name | ---------------------------------- | 1 | users | Oran | | 3 | users | Oran | | 7 | users | Oran | | 10 | users | Oran | | 5 | admin | Oran | | 9 | admin | Oran |
我实际上在总结'total_lines'列中“my_derived_table”的内容:4 + 2 = 6
| total_lines | --------------- 1) | 4 | 2) | 2 |
答案 2 :(得分:0)
shalom yael-试试这段代码 -
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]
答案 3 :(得分:0)
你在找这个,
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'