이 경우를 상상해보십시오. 그러나 더 많은 구성 요소 버킷과 더 많은 중간체 및 출력이 있습니다. 중간체의 대부분은 상세 수준에서 계산되지만 몇 가지가 집계 수준에서 계산됩니다 같은 공식이 얼마나SQL에서 집계 수준 수식 재사용 - 좋은 전술?
DECLARE @Profitability AS TABLE
(
Cust INT NOT NULL
,Category VARCHAR(10) NOT NULL
,Income DECIMAL(10, 2) NOT NULL
,Expense DECIMAL(10, 2) NOT NULL
,Liability DECIMAL(10, 2) NOT NULL
,AllocatedCapital DECIMAL(10, 2) NOT NULL
) ;
INSERT INTO @Profitability
VALUES (1, 'Software', 100, 50, 0, 0) ;
INSERT INTO @Profitability
VALUES (2, 'Software', 100, 20, 0, 0) ;
INSERT INTO @Profitability
VALUES (3, 'Software', 100, 60, 0, 0) ;
INSERT INTO @Profitability
VALUES (4, 'Software', 500, 400, 0, 0) ;
INSERT INTO @Profitability
VALUES (
5
,'Hardware'
,1000
,550
,0
,0
) ;
INSERT INTO @Profitability
VALUES (
6
,'Hardware'
,1000
,250
,500
,200
) ;
INSERT INTO @Profitability
VALUES (
7
,'Hardware'
,1000
,700
,500
,600
) ;
INSERT INTO @Profitability
VALUES (
8
,'Hardware'
,5000
,4500
,2500
,800
) ;
WITH ProfitView
AS (SELECT Cust
,Category
,Income
,Expense
,Profit = Income - Expense
,NetProfit = Income - Expense
- CASE WHEN Liability - AllocatedCapital > 0
THEN Liability - AllocatedCapital
ELSE 0
END
FROM @Profitability
)
SELECT Cust
,Category
,Income
,Expense
,Profit
,NetProfit
,Margin = Profit/Income
,NetMargin = NetProfit/Income
FROM ProfitView ; -- NOTE I've left off the AFTER grouping formulas on this one.
WITH ProfitView
AS (SELECT Cust
,Category
,Income
,Expense
,Profit = Income - Expense
,NetProfit = Income - Expense
- CASE WHEN Liability - AllocatedCapital > 0
THEN Liability - AllocatedCapital
ELSE 0
END
FROM @Profitability
),
GROUP1
AS (SELECT Category
,SUM(Profit) AS Profit
,SUM(NetProfit) AS NetProfit
,SUM(Income) AS Income
,SUM(Profit)/SUM(Income) AS Margin
,SUM(NetProfit)/SUM(Income) AS NetMargin
FROM ProfitView
GROUP BY Category
),
GROUP2
AS (SELECT GROUP1.*
,NetProfit - Profit AS Exposure
FROM GROUP1
)
SELECT *
,Exposure/Income AS ExposureRatio
FROM GROUP2 ;
WITH ProfitView
AS (SELECT Cust
,Category
,Income
,Expense
,Profit = Income - Expense
,NetProfit = Income - Expense
- CASE WHEN Liability - AllocatedCapital > 0
THEN Liability - AllocatedCapital
ELSE 0
END
FROM @Profitability
),
GROUP1
AS (SELECT SUM(Profit) AS Profit
,SUM(NetProfit) AS NetProfit
,SUM(Income) AS Income
,SUM(Profit)/SUM(Income) AS Margin
,SUM(NetProfit)/SUM(Income) AS NetMargin
FROM ProfitView
),
GROUP2
AS (SELECT GROUP1.*
,NetProfit - Profit AS Exposure
FROM GROUP1
)
SELECT *
,Exposure/Income AS ExposureRatio
FROM GROUP2 ;
주의는 다른 집계 레벨에서 사용할 수 있습니다. 코드 중복이 발생합니다.
나는 UDF를 (스칼라 또는 최종 결과 보낸 사람 많은 집계 수준에서 계산되어야한다 중간체를 공유 할 수 있습니다 APPLY OUTER 키워드와 가치 테이블),하지만 내 경험 스칼라 및 멀티를 사용하는 생각 명령문 테이블 반환 UDF는 매우 잘 수행되지 않습니다.
또한 동적 SQL을 사용하고 수식을 이름으로 적용하는 것에 대해 생각했습니다.
동기화 및/또는 체계적으로 다른 수준에서 적용해야하는 이러한 종류의 수식을 유지하는 데 필요한 다른 기술, 기법 또는 전술은 무엇입니까?
정확하게 이해했다면 CREATE VIEW myview AS SELECT SUM (수입 - 비용) FROM mytable GROUP BY x'와 같은 것을 원하십니까? –
Quassnoi
@Quassnoi - 기본적으로 집계에 관계없이 모든 적절한 입력 열이있는 집합에 동일한 수식을 일관되게 적용 할 수 있기를 원합니다. –
이렇게하면 각 쿼리를 다시 구문 분석하고 각 최적화를 다시 수행해야하므로 수식이 실제로 그렇게 어려운 경우 동적 SQL을 사용할 수 있습니다. – Quassnoi