你如何联合多个CTE?

Ste*_*veC 47 sql-server union common-table-expression

你如何使用UNION多个Common Table Expressions

我正在尝试汇总一些摘要数字,但无论我把它放在哪里;,我总是会收到错误

SELECT  COUNT(*)
FROM    dbo.Decision_Data
UNION
SELECT  COUNT(DISTINCT Client_No)
FROM    dbo.Decision_Data
UNION
WITH    [Clients]
          AS ( SELECT   Client_No
               FROM     dbo.Decision_Data
               GROUP BY Client_No
               HAVING   COUNT(*) = 1
             )
    SELECT  COUNT(*) AS [Clients Single Record CTE]
    FROM    Clients;
Run Code Online (Sandbox Code Playgroud)

更新:我很欣赏上面的例子我可以将单个 CTE移到开头,但我有一些我想要的CTEUNION

Tho*_*mas 86

如果您尝试联合多个CTE,则需要先声明CTE然后再使用它们:

With Clients As
    (
    Select Client_No
    From dbo.Decision_Data
    Group By Client_No
    Having Count(*) = 1
    )
    , CTE2 As
    (
    Select Client_No
    From dbo.Decision_Data
    Group By Client_No
    Having Count(*) = 2
    )
Select Count(*)
From Decision_Data
Union
Select Count(Distinct Client_No)
From dbo.Decision_Data
Union
Select Count(*)
From Clients
Union
Select Count(*)
From CTE2;
Run Code Online (Sandbox Code Playgroud)

你甚至可以使用另一个CTE:

With Clients As
        (
        Select Client_No
        From dbo.Decision_Data
        Group By Client_No
        Having Count(*) = 1
        )
        , CTE2FromClients As
        (
        Select Client_No
        From Clients
        )
    Select Count(*)
    From Decision_Data
    Union
    Select Count(Distinct Client_No)
    From dbo.Decision_Data
    Union
    Select Count(*)
    From Clients
    Union
    Select Count(*)
    From CTE2FromClients;
Run Code Online (Sandbox Code Playgroud)

WITH common_table_expression(Transact-SQL)

  • @SteveC - 简而言之,您需要先在最终表达式中声明要使用的所有CTE,然后在union查询中使用它们. (2认同)

Dav*_*haw 13

你可以这样做:

WITH    [Clients]
          AS ( SELECT   Client_No
               FROM     dbo.Decision_Data
               GROUP BY Client_No
               HAVING   COUNT(*) = 1
             ),
        [Clients2]
          AS ( SELECT   Client_No
               FROM     dbo.Decision_Data
               GROUP BY Client_No
               HAVING   COUNT(*) = 1
             )
SELECT  COUNT(*)
FROM    Clients
UNION
SELECT  COUNT(*)
FROM    Clients2;
Run Code Online (Sandbox Code Playgroud)