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 

당신은 모든 범주에 대한 제로 이벤트와 제조 표시해야하는 경우 가졌 제거 문을 추가하여 'Division by zero'를 처리하십시오. 또한 모든 출력 열에 대해 별칭을 추가하십시오.

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 출력의 각 값을 반복하고 값 테이블을 얻는다면, 임시 테이블을 채우는 분할 함수를 사용한다.

마지막 코멘트에 앞서 언급 한 방법을 사용, 또는 여기에 설명 된대로 열을 알 수없는 번호로 PIVOT 기능을 사용 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