此查询对一些值求和,然后计算折扣,然后对所得的总计计算税收。有没有一种更好的方法可以做到投影后不会投影……?
SELECT
Total,
Discount,
TotalDiscounted,
TotalDiscounted * 0.2 AS VAT
FROM
(SELECT
Total,
Discount,
Total - Discount AS TotalDiscounted
FROM
(SELECT
Total,
Total * 0.1 AS Discount
FROM
(SELECT
SUM(Value) AS Total
FROM
(SELECT 1 AS Value UNION
SELECT 2) a ) b ) c ) d
结果...
3、0.3、2.7、0.54
答案 0 :(得分:2)
我更喜欢CROSS APPLY
创建可以按行使用的计算值,就像使用变量一样。这个例子是 fat </ em>,但是我想展示 apply的美丽:
DECLARE @tbl TABLE(GroupingID INT, [Value] DECIMAL(10,4));
INSERT INTO @tbl VALUES(1,1),(1,2) --Group 1 has 1 and 2
,(2,10),(2,15),(2,20);--Group 2 has 10, 15 and 20
WITH cte AS
(
SELECT GroupingID
,SUM(t.[Value]) AS SumValue
FROM @tbl t
GROUP BY t.GroupingID
)
SELECT *
FROM cte
CROSS APPLY(SELECT SumValue * 0.1) A(Discount)
CROSS APPLY(SELECT SumValue-Discount) B(TotalDiscounted)
CROSS APPLY(SELECT TotalDiscounted * 0.2) C(VAT);
这是完全基于设置的。 cte对每个组进行求和,其结果集用于SELECT
。
答案 1 :(得分:1)
SELECT
SUM(Value) AS Total,
SUM(Value) * 0.1 AS Discount,
SUM(Value) - SUM(Value) * 0.1 AS TotalDiscounted,
(SUM(Value) - SUM(Value) * 0.1) * 0.2 AS VAT
FROM
(SELECT 1 AS Value UNION
SELECT 2) a
答案 2 :(得分:1)
您可以使用CROSS APPLY来使用/重用您的派生字段
WITH TotalBase
AS
(
SELECT SUM(SQ1.Value) AS Total
FROM (
SELECT 1 UNION ALL
SELECT 2
) AS SQ1(Value)
)
SELECT A.Total,
CA1.Discount,
CA2.TotalDiscounted,
CA3.VAT
FROM TotalBase AS A
CROSS
APPLY (SELECT A.Total * 0.1) AS CA1(Discount)
CROSS
APPLY (SELECT A.Total - CA1.Discount) AS CA2(TotalDiscounted)
CROSS
APPLY (SELECT CA2.TotalDiscounted * 0.2) AS CA3(VAT);