CASE 식을 기반으로 집계를 수행하는보기를 만들었습니다. 뷰가 기반으로하는 트랜잭션 테이블에는 약 9 억 개의 행이 있습니다. 날짜와 제품 코드를 포함한 여러 기준을 토대로 가치를 집계해야합니다. 필터없이 집계를 수행 할 때 데이터를 한 번만 전체 검사해야 할 필요가 있으므로 case 문을 사용하면 각 조건에 대한 쿼리를 실행하지 않고 단지 한 번의 검사 만 수행 할 수 있습니다.집계 사례 구문 집계 SQL Server
내가 알기로는 너무 많은 집계 사례 문을 사용하는 것이 실제로 속도가 느려진다는 것입니다.
이 사례를 집계 아닌 다른 방법이있다 : 여기 는 명확성을 위해SELECT [ContactID] AS [ContactID],
COUNT(DISTINCT CASE
WHEN [Category] = 'Dog Food'
AND [TransactionDate]
BETWEEN DATEADD(MONTH, -12, DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0)) AND DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0)
THEN [TransactionDate]
ELSE NULL
END
) AS [Dog_FoodTx12mth],
COUNT(DISTINCT CASE
WHEN [Category] = 'Cat Food'
AND [Lifestage] LIKE 'Kitten%'
AND [TransactionDate]
BETWEEN DATEADD(MONTH, -3, DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0)) AND DATEADD(DAY, DATEDIFF(DAY, 0, GETDATE()), 0)
THEN [TransactionDate]
ELSE NULL
END
) AS [Cat_FoodKittenTx3mth]
FROM [dbo].[GI_TransactionLineProductContact]
GROUP BY [ContactID];
편집 질문 (실제 쿼리에서 아마 50 열이있을 것입니다) 단 2 열 내 쿼리의 예입니다 어쨌든 적어도 한 번 이상 테이블을 완전히 읽어야 할 것임을 명심하십시오. 내 주요 문제는 다른 CASE 표현식에 대한 모든 중첩 루프라고 생각합니다. 각각의 새로운 case 표현식은 많은 비용을 추가하는 것으로 보입니다. 2 개의 CASE 표현식과 50 개의 CASE 표현식을 가진 동일한 기준에 대한 쿼리의 예상 실행 계획을 수행하면 첫 번째 쿼리는 20 %의 비용을 나타내고 두 번째 쿼리는 80 %의 배치 비용을 보여줍니다.
그래서이 디자인이 가장 효율적이지 않고 사용할 수있는 잠재적 인 대체 방법을 찾고 있다고 생각합니다.
감사합니다.
'count (distinct) '를 제거 할 수 있습니까? –
또한'DATEADD (DAY, DATEDIFF (DAY, 0, GETDATE()), 0)'을'GETDATE()'로 대체 할 수 없습니까? 당신이 그걸로 무엇을 하려는지 확실하지 않습니까? 또는'CAST (GETDATE() AS DATE)' – Tanner
이 경우 뚜렷한 부분을 없앨 수는 없습니다. dateadd가 날짜에서 시간을 스트립하고 있습니다. 네, 캐스트 (GetDate()로 Date) 할 수 있지만 내 연구 datead 메서드가 더 효율적임을 보여 주었다. –