逐步进行整体操作

时间:2018-10-24 14:23:26

标签: sql-server tsql

此查询对一些值求和,然后计算折扣,然后对所得的总计计算税收。有没有一种更好的方法可以做到投影后不会投影……?

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

3 个答案:

答案 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);