2014-01-07 1 views
0

У меня есть ЗЕЬЕСТ следующим образом: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 

Я хочу, чтобы сделать его вернуть 'Обслуживаемые' и фракция (2 из 5), например: ремонт (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 - исследуя этот ответ я обнаружил, что длина по умолчанию для 'VARCHAR' в' 'функции CONVERT' CAST' или 30. Это отражено в [TechNet] (http://technet.microsoft .com/en-us/library/ms176089.aspx) – Rob

Смежные вопросы