2015-10-14 32 views
0

我确定我只是在搜索错误的查询,所以如果有的话,请随时指出我的重复。在同一张表上执行联合

我有一张桌子;
项目
idProject |名称| Number |状态| DateRaised

我想什么做的,是能够看到的募集项目的数量,赢了,输了,等

以为是我能与工会做到这一点,像这样;

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 

虽然我所得到的是一张两倍大小的桌子。

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

当我其实想是这样的;

2015 | 10 | 5 | NULL | NULL 

也许联合是错误的构造。我现在实际上处于亏损状态。我相当肯定这是我以前做过的,但没有以前的代码工作,我现在完全失去了。

回答

2

可以使用条件的聚集,而不是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) 

此外,您可以去除YEARCONVERT功能。

+1

当然!我知道有一种更简单/更聪明的方式来完成任务!谢谢。 – Trent