在存储过程中从CTE中选择具有不同行数的多选

时间:2019-04-11 19:59:59

标签: sql sql-server tsql common-table-expression multiple-select-query

如何使用CTE的联接进行两次选择,该联接返回两次选择中的总列数?

我尝试进行并集,但这会追加到同一列表中,因此无法区分以进一步使用。

WITH campus AS
(SELECT DISTINCT CampusName, DistrictName
FROM            dbo.file
),creditAcceptance AS
(SELECT        CampusName, EligibilityStatusFinal, CollegeCreditAcceptedFinal, COUNT(id) AS N
FROM            dbo.file
WHERE        (EligibilityStatusFinal LIKE 'Eligible%') AND (CollegeCreditEarnedFinal = 'Yes') AND (CollegeCreditAcceptedFinal = 'Yes')
GROUP BY CampusName, EligibilityStatusFinal, CollegeCreditAcceptedFinal
),eligibility AS
(SELECT        CampusName, EligibilityStatusFinal, COUNT(id) AS N, CollegeCreditAcceptedFinal
FROM            dbo.file
WHERE        (EligibilityStatusFinal LIKE 'Eligible%') 
GROUP BY CampusName, EligibilityStatusFinal, CollegeCreditAcceptedFinal
)
SELECT        a.CampusName, c.[EligibilityStatusFinal], SUM(c.N) AS creditacceptCount
FROM            campus  as a FULL OUTER JOIN creditAcceptance as c ON a.CampusName=c.CampusName
WHERE        (a.DistrictName = 'xy')
group by a.CampusName ,c.EligibilityStatusFinal
Union ALL
SELECT      a.CampusName ,  b.[EligibilityStatusFinal], SUM(b.N) AS eligible
    From Campus as a FULL OUTER JOIN eligibility    as b ON a.CampusName = b.CampusName

WHERE        (a.DistrictName = 'xy') 
group by a.CampusName,b.EligibilityStatusFinal

预期输出:

+------------+------------------------+--------------------+
| CampusName | EligibilityStatusFinal | creditacceptCount  |
+------------+------------------------+--------------------+
| M          | G                      | 1                  |
| E          | NULL                   | NULL               |
| A          | G                      | 4                  |
| B          | G                      | 8                  |
+------------+------------------------+--------------------+

+------------+------------------------+----------+
| CampusName | EligibilityStatusFinal | eligible |
+------------+------------------------+----------+
| A          | G                      |        8 |
| C          | G                      |        9 |
| A          | T                      |        9 |
+------------+------------------------+----------+

1 个答案:

答案 0 :(得分:0)

如您所见,here CTE只能在单个语句中使用,因此CTE无法获得预期的输出。

这是Microsoft文档的摘录:

  

CTE后必须紧跟单个 SELECT,INSERT,UPDATE或DELETE   引用部分或全部CTE列的语句。 CTE也可以   在CREATE VIEW语句中指定为定义SELECT的一部分   视图的陈述。

您可以改用表变量(declare @campus table(...))或临时表(create table #campus (...))。