SUM查询的结果包含UNION ALL和CTE

时间:2014-12-22 04:12:04

标签: sql sql-server

即使我找到了类似于我所需要的东西,但我还是无法解决这个问题。

所以,我会问我的例子。

(继续我的上一个问题: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!

4 个答案:

答案 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

  1. 我必须为我的派生表添加别名。
  2. 在“THIS”和“SELECT”之间设置附加选择(使用SUM)。
  3. 为每个查询更改为COUNT并为其添加别名。
  4. 像这样:

    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'