在同一个 Table 上执行联合

Performing a Union on the same Table

我确定我只是在搜索错误的查询,如果是这样,请随时指出重复项。

我有一个table;
项目
id项目 |名称 |编号 |状态 |提出日期

我想做的是能够看到筹集、赢得、失败等项目的数量。

认为我可以通过工会来做到这一点,就像这样;

SELECT
CONVERT(nvarchar, DATEPART(YEAR, DateRaised),107) AS [Year],
COUNT(*) AS [Tenders Received],
'' AS [Tenders Won],
NULL AS [Tenders Lost],
NULL AS [Tenders Pending],
FROM Projects P
GROUP BY DATEPART(YEAR, DateRaised)

UNION

SELECT
CONVERT(nvarchar, DATEPART(YEAR, DateRaised),107) AS [Year],
'' AS [Tenders Received],
COUNT(*) AS [Tenders Won],
NULL AS [Tenders Lost],
NULL AS [Tenders Pending],
FROM Projects P
WHERE P.ProjectStatus = 2
GROUP BY DATEPART(YEAR, DateRaised)

ORDER BY [YEAR] DESC

不过,我得到的只是 table 两倍的尺寸。

2015 | 10   | NULL | NULL | NULL
2015 | NULL | 5    | NULL | NULL

当我其实想要的是这个;

2015 | 10 | 5 | NULL | NULL

也许 union 是错误的结构。我现在真的很茫然。我相当确定我以前就是这样做的,但是没有以前的代码可以解决,我现在完全迷路了。

您可以使用条件聚合代替 UNION:

SELECT
    DATEPART(YEAR, DateRaised) AS [Year],
    COUNT(*) AS [Tenders Received],
    SUM(CASE WHEN P.ProjectStatus = 2 THEN 1 ELSE 0 END) AS [Tenders Won],
    NULL AS [Tenders Lost],
    NULL AS [Tenders Pending]
FROM Projects P
GROUP BY DATEPART(YEAR, DateRaised)

此外,您可以删除 YEAR 上的 CONVERT 功能。