2014-01-07 56 views
0

写一小部分我有一个SELECT语句如下:SQL:在SELECT(存储过程)

select car.car_ID,isnull(#tmpCount.RowCounter,0) AS RowCounter,ISNULL(#tmpNotServiced.DistinctCounter,0) AS DistinctCounter, ISNULL(#tmpNA.NACounter,0) AS NACounter, (isnull(#tmpCount.RowCounter,0) + ISNULL(#tmpNotServiced.DistinctCounter,0) + ISNULL(#tmpNA.NACounter,0)) AS Total, (CASE ISNULL(#tmpNotServiced.DistinctCounter,0) WHEN 0 THEN 'Closed' ELSE 'Open' END) AS Status 
from car 
left outer join #tmpCount 
on car.AUD_ID = #tmpCount.car_ID 
left outer join #tmpNotServiced 
on car.AUD_ID = #tmpNotServiced.car_ID 
LEFT OUTER JOIN #tmpNA 
ON car.car_ID = #tmpNA.car_ID 

然后一个存储过程[p_GetServiced]计数所有开放和全封闭。

CREATE PROCEDURE [dbo].[p_GetServiced] 

    AS 
    BEGIN 

SET NOCOUNT ON; 

CREATE TABLE #tmp1 
(
    car_ID BIGINT, 
    RowCounter BIGINT, 
    DistinctCounter BIGINT, 
    NACounter BIGINT, 
    Total BIGINT, 
    [Status] VARCHAR(MAX) 
) 
CREATE TABLE #tmp2 (car_ServiceDate DATETIME) 

INSERT INTO #tmp1 
EXEC [p_GetServiceDetail] 

SELECT [Status] AS [Serviced], COUNT(*) AS [Status] FROM #tmp1 
GROUP BY [Status] 


INSERT INTO #tmp2 
SELECT car_TargetDate FROM dbo.car 
END 
GO 

我想让它返回 '服务' 和一小部分(5 2)如:服务(2/5)或NotServiced(3/5)

:2作为开放和5总行

回答

1

下应该给你两列,一个用于封闭和一个开放的状态和输出在你想要的格式是两行。

SELECT '[OPEN]', 
CONVERT(NVARCHAR(100), (SELECT COUNT(*) FROM #tmp1 WHERE [Status] = 'OPEN')) + 
' of ' + CONVERT(NVARCHAR(100), COUNT(*)) 
FROM #tmp1 
UNION 
SELECT '[CLOSED]', 
CONVERT(NVARCHAR(100), (SELECT COUNT(*) FROM #tmp1 WHERE [Status] = 'CLOSED')) + 
' of ' + CONVERT(NVARCHAR(100), COUNT(*)) 
FROM #tmp1 
+0

很好的答案,只是问:所以它基本上连接计数? – inzefinite

+0

@inzefinite它是子查询计数与表的总计数的串联。如果我将'COUNT'函数结果分离出变量,然后再将它们连接起来,可能会更加整洁。 – XN16

1
INSERT INTO #tmp1 
EXEC [p_GetServiceDetail] 

DECLARE @TotalRows BIGINT 
SELECT @TotalRows = COUNT(*) FROM #tmp1 

SELECT [Status] AS [Serviced], COUNT(*) AS [Status], @TotalRows AS [Rows] 
FROM #tmp1 
GROUP BY [Status] 

或者,有重读你的问题,我觉得更令人满意的方法是利用OVER条款:

SELECT DISTINCT 
Status 
+ ' (' 
+ CONVERT(VARCHAR, count(*) OVER (PARTITION BY status)) 
+ ' OF ' 
+ CONVERT(VARCHAR, count(*) OVER()) 
+ ')' 
FROM #tmp1 

我们得到以下:

Serviced (1 OF 4) 
NotServiced (3 OF 4) 
+0

FYI - 而研究此答案我发现,在一个'CAST'或'CONVERT'功能'VARCHAR'缺省长度为30。这在[的TechNet](http://technet.microsoft记录.com/en-us/library/ms176089.aspx) – Rob