0

我使用下面提供的查詢作爲輸出獲得下表。CTE的條件語句計數

enter image description here

下面是我使用的查詢。

;WITH cte AS (
     SELECT c.CaseID AS 'Case #', 
     m.ManufacturerName, 
     ou.OutcomeName 
FROM Consumes con 
INNER JOIN [Case] c 
ON con.FKCaseID = c.CaseID 
INNER JOIN Manufacturer m 
ON m.ManufacturerID = con.FKManufacturerID 
INNER JOIN Case_Outcome oc 
ON oc.FKCaseID = c.CaseID 
INNER JOIN OutCome ou 
ON oc.FKOutcomeID = ou.OutcomeID 
) 

SELECT c.[Case #], 
c.ManufacturerName, 
     STUFF((SELECT ','+OutcomeName 
     FROM cte 
     WHERE c.[Case #] = [Case #] 
     FOR XML PATH('')),1,1,'') as OutcomeName 
FROM cte c 
GROUP BY c.[Case #],c.ManufacturerNAme 

我需要得到下面的輸出。

enter image description here

這裏事件的數量是情況#每個製造商計數。有沒有一種方法,我可以得到上面的輸出,而不使用每個輸出的CTE在哪裏條件?如果是這樣,請幫助一個例子。

我在回答中使用了下面的查詢,但其結果百分比始終爲0%或100%。也就是說,如果案件的結果完全相同,那麼這可以正常工作。

SELECT 
    m.ManufacturerName, 
    COUNT(c.CaseID) AS '# Events', 
    COUNT(CASE WHEN ou.OutcomeName = 'Death' THEN c.CaseID ELSE NULL END) /COUNT(c.CaseID)*100.0 AS 'Death Events', 
    COUNT(CASE WHEN ou.OutcomeName = 'Hospitalization' THEN c.CaseID ELSE NULL END)/COUNT(c.CaseID)*100.0 AS 'Hospitalization Events', 
    COUNT(CASE WHEN ou.OutcomeName = 'Life Threatening' THEN c.CaseID ELSE NULL END)/COUNT(c.CaseID)*100.0 AS 'Life Threatening Events', 
    COUNT(CASE WHEN ou.OutcomeName = 'Disability' THEN c.CaseID ELSE NULL END)/COUNT(c.CaseID)*100.0 AS 'Disability Events', 
    COUNT(CASE WHEN ou.OutcomeName = 'Congenital Anomaly' THEN c.CaseID ELSE NULL END)/COUNT(c.CaseID)*100.0 AS 'Congenital Anomaly Events', 
    COUNT(CASE WHEN ou.OutcomeName = 'Required Intervention' THEN c.CaseID ELSE NULL END)/COUNT(c.CaseID)*100.0 AS 'Required Intervention Events', 
    COUNT(CASE WHEN ou.OutcomeName = 'Other Serious' THEN c.CaseID ELSE NULL END)/COUNT(c.CaseID)*100.0 AS 'Other Serious Events' 
FROM Consumes con 
    INNER JOIN [Case] c ON con.FKCaseID = c.CaseID 
    INNER JOIN Manufacturer m ON m.ManufacturerID = con.FKManufacturerID 
    INNER JOIN Case_Outcome oc ON oc.FKCaseID = c.CaseID 
    INNER JOIN OutCome ou ON oc.FKOutcomeID = ou.OutcomeID 
GROUP BY m.ManufacturerName 

但是,當結果不同時,它不會返回正確的答案。以下是每種情況下的計數。

enter image description here

但我的百分比結果集如下所示。

enter image description here

+0

我不明白的問題。您的查詢中並沒有真正的「where」條件(除了關聯子句)。 –

回答

1

UPDATE:(固定四捨五入的問題 - 在COUNT前移至100.00())

SELECT 
    m.ManufacturerName, 
    COUNT(DISTINCT c.CaseID), 
    100.0 * COUNT(DISTINCT CASE WHEN ou.OutcomeName = 'Death' THEN c.CaseID ELSE NULL END)/COUNT(DISTINCT c.CaseID), 
    100.0 * COUNT(DISTINCT CASE WHEN ou.OutcomeName = 'Hospitalization' THEN c.CaseID ELSE NULL END)/COUNT(DISTINCT c.CaseID), 
    100.0 * COUNT(DISTINCT CASE WHEN ou.OutcomeName = 'Life Threatening' THEN c.CaseID ELSE NULL END)/COUNT(DISTINCT c.CaseID) 
FROM Consumes con 
    INNER JOIN [Case] c ON con.FKCaseID = c.CaseID 
    INNER JOIN Manufacturer m ON m.ManufacturerID = con.FKManufacturerID 
    INNER JOIN Case_Outcome oc ON oc.FKCaseID = c.CaseID 
    INNER JOIN OutCome ou ON oc.FKOutcomeID = ou.OutcomeID 
GROUP BY m.ManufacturerName 
HAVING COUNT(DISTINCT c.CaseID) <> 0 

如果你需要顯示爲零活動所有類別的生產,除去具有並添加聲明以處理「由零劃分」。還要爲所有輸出列添加別名。

UPDATE:

如果要求使用CTE的唯一輸出,則數據可以以這種方式被轉換:

declare @sql NVARCHAR(MAX) = ' 
declare @temp table (case_id varchar(100), manufacture varchar(1000), outcome varchar(max)) 

insert into @temp 
' 

select @sql = @sql + 'select ''' + t.case_id + ''', ''' + t.Manufacture + ''', s.Data from dbo.Split(''' + t.outcome + ''', '','') s union all' + char(13) + char(10) 
from @t t 

set @sql = LEFT(@sql, len(@sql) - 12) + char(13) + char(10) + char(13) + char(10) 

set @sql = @sql + 'select * from @temp' 

--print @sql 
exec (@sql) 

您需要實現分割功能(可多實現)。 根據您的設計更改列名稱。 EXEC的輸出可以被插入到臨時表

INSERT #TEMP (...) 
EXEC (@SQL) 

或者,您也可以通過CTE輸出的每個值環和使用分割函數來獲取表值,並填充臨時表。

最後使用註釋前面提到的方法,或者使用旋轉功能未知數量的列如下所述:Efficiently convert rows to columns in sql server

+0

當所有結果都相同的情況下,這工作正常。當同一個案件有多個結果時,這不會給出正確的結果。我用我得到的輸出編輯了這個問題。 – mayooran

+0

我沒有機會檢查我的腳本,因爲您沒有提供表格的定義。問題是輕微的 - 這是因爲四捨五入 - 只是在「COUNT(...」。「select 3/9 * 100.0」前面移動「* 100.00」與「100.0 * 3/9」不一樣 – Anton

+0

嘿沒有硬編碼的情況下,有沒有一種方法,我可以從結果列的逗號分隔值中提取它們並從中計算百分比? – mayooran