1

您好,我正在运行下面的查询,我的 [sumofnetsales] 金额为空值。有谁知道可能是什么问题?

另外,如果我想使用 [SumofAmountShipped] 列而不是在减法方程中再次对其求和,我该怎么做?谢谢你。

DECLARE @Rundate datetime
SET @RunDate = '3/11/2013' -- Date they run the report 


--Temp Tables to sum up all accural types

Declare @Chargeback table (Amount money, ShortItemNo int, ProductName varchar(50))
INSERT @Chargeback
SELECT sum(a.AccrualAmount),
       ShortItemNo,
       ProductName
FROM 
    Accruals a
WHERE 
    @RunDate between a.AccrualBeginDate and a.AccrualEndDate and a.enddate = '12/31/2200' and accrualtype = 2
Group By
    ShortItemNo,
    ProductName


Declare @AdjustedForNetPrice table (Amount money, ShortItemNo int, ProductName varchar(50))
INSERT @AdjustedForNetPrice
SELECT sum(a.AccrualAmount),
       ShortItemNo,
       ProductName
FROM 
    Accruals a
WHERE 
    @RunDate between a.AccrualBeginDate and a.AccrualEndDate and a.enddate = '12/31/2200' and accrualtype = 2
Group By
    ShortItemNo,
    ProductName


Declare @AdminFee table (Amount money, ShortItemNo int, ProductName varchar(50))
INSERT @AdminFee
SELECT sum(a.AccrualAmount),
       ShortItemNo,
       ProductName
FROM 
    Accruals a
WHERE 
    @RunDate between a.AccrualBeginDate and a.AccrualEndDate and a.enddate = '12/31/2200' and accrualtype = 1
Group By
    ShortItemNo,
    ProductName


Declare @Returns table (Amount money, ShortItemNo int, ProductName varchar(50))
INSERT @Returns
SELECT sum(a.AccrualAmount),
       ShortItemNo,
       ProductName
FROM 
    Accruals a
WHERE 
    @RunDate between a.AccrualBeginDate and a.AccrualEndDate and a.enddate = '12/31/2200' and accrualtype = 3
Group By
    ShortItemNo,
    ProductName


Declare @Rebates table (Amount money, ShortItemNo int, ProductName varchar(50))
INSERT @Rebates
SELECT sum(a.AccrualAmount),
       ShortItemNo,
       ProductName
FROM 
    Accruals a
WHERE 
    @RunDate between a.AccrualBeginDate and a.AccrualEndDate and a.enddate = '12/31/2200' and accrualtype = 4
Group By
    ShortItemNo,
    ProductName


Declare @ACCPSW1 table (Amount money, ShortItemNo int, ProductName varchar(50))
INSERT @ACCPSW1
SELECT sum(a.AccrualAmount),
       ShortItemNo,
       ProductName
FROM 
    Accruals a
WHERE 
    @RunDate between a.AccrualBeginDate and a.AccrualEndDate and a.enddate = '12/31/2200' and accrualtype = 5
Group By
    ShortItemNo,
    ProductName


Declare @CashDiscount table (Amount money, ShortItemNo int, ProductName varchar(50))
INSERT @CashDiscount
SELECT sum(a.AccrualAmount),
       ShortItemNo,
       ProductName
FROM 
    Accruals a
WHERE 
    @RunDate between a.AccrualBeginDate and a.AccrualEndDate and a.enddate = '12/31/2200' and accrualtype = 6
Group By
    ShortItemNo,
    ProductName


Declare @INIT1 table (Amount money, ShortItemNo int, ProductName varchar(50))
INSERT @INIT1 
SELECT sum(a.AccrualAmount),
       ShortItemNo,
       ProductName
FROM 
    Accruals a
WHERE 
    @RunDate between a.AccrualBeginDate and a.AccrualEndDate and a.enddate = '12/31/2200' and accrualtype = 7
Group By
    ShortItemNo,
    ProductName


Declare @Medicaid table (Amount money, ShortItemNo int, ProductName varchar(50))
INSERT @Medicaid 
SELECT sum(a.AccrualAmount),
       ShortItemNo,
       ProductName
FROM 
    Accruals a
WHERE 
    @RunDate between a.AccrualBeginDate and a.AccrualEndDate and a.enddate = '12/31/2200' and accrualtype = 8
Group By
    ShortItemNo,
    ProductName


Declare @InitialOrderDiscount table (Amount money, ShortItemNo int, ProductName varchar(50))
INSERT @InitialOrderDiscount
SELECT sum(a.AccrualAmount),
       ShortItemNo,
       ProductName
FROM 
    Accruals a
WHERE 
    @RunDate between a.AccrualBeginDate and a.AccrualEndDate and a.enddate = '12/31/2200' and accrualtype = 9
Group By
    ShortItemNo,
    ProductName





SELECT
    rtrim(IMDSC1) [ItemDesc1],
    rtrim(IMDSC2) [ItemDesc2],
    sum(QuantityShipped) [SumOfQuantityShipped],
    sum(ExtendedPrice) [SumOfAmountShipped],
    rtrim(IMSRTX) [BrandName],
    '' [SumOfNetSaleUnitPrice],
    sum(ExtendedPrice) - c.Amount - a.Amount - af.Amount - r.Amount - rr.Amount - ac.Amount - cd.Amount - i.Amount - m.Amount - id.Amount [SumOfNetSales],
    '' [SumOfGrossProfit],
    '' [SumOfGrossMargin],
    '3/11/2013' [Rundate]
FROM
    SalesSummary ss join [Product] p 
        on ss.ShortItemNo = p.SDITM
    join JDE_PRODUCTION.PRODDTA.F4101 im 
        on im.IMITM = p.SDITM
    left join @Chargeback c 
        on c.ShortItemNo = ss.ShortItemNo
    left join @AdjustedForNetPrice a
        on a.ShortItemNo = ss.ShortItemNo
    left join @AdminFee af
        on af.ShortItemNo = ss.ShortItemNo
    left join @Returns r 
        on r.ShortItemNo = ss.ShortItemNo
    join @Rebates rr
        on rr.ShortItemNo = ss.ShortItemNo
    left join @ACCPSW1 ac
        on ac.ShortItemNo = ss.ShortItemNo
    left join @CashDiscount cd
        on cd.ShortItemNo = ss.ShortItemNo
    left join @INIT1 i
        on i.ShortItemNo = ss.ShortItemNo
    left join @Medicaid m
        on m.ShortItemNo = ss.ShortItemNo
    left join @InitialOrderDiscount id
        on id.ShortItemNo = ss.ShortItemNo      

WHERE 
    ss.InvoiceDate = @RunDate

GROUP BY
    rtrim(IMDSC1),
    rtrim(IMDSC2),
    rtrim(IMSRTX),
    c.Amount,
    a.Amount,
    af.Amount,
    r.Amount,
    rr.Amount,
    ac.Amount,
    cd.Amount,
    i.Amount,
    m.Amount,
    id.Amount
ORDER BY 
    rtrim(IMDSC1),
    rtrim(IMDSC2) 
4

3 回答 3

2

您得到null是因为减法中的列值之一是null. 就像是:

1000 - null = null

您必须使用coalesce(<column>, 0)(= ANSI SQL 方式)来避免这种情况,或者使用ISNULL()函数(特定于 SQL Server)。你的减法线看起来像:

sum(coalesce(ExtendedPrice, 0)) - coalesce(c.Amount,0) - coalesce(a.Amount, 0) 
    - coalesce(af.Amount, 0) - ... and so on ... [SumOfNetSales]

从你的第二点开始:你不能避免在减法中写出 [SumofAmountShipped] 列,因为你不能在同一个语句中使用刚刚定义的别名。

于 2013-08-27T13:51:59.367 回答
0

有点难以理解您的代码,但问题很可能出在 JOIN 上。

使用左连接时,如果只存在左侧,它将返回左侧 + 右侧的 NULL。如果您在涉及 NULL 的情况下进行任何算术运算,结果将始终为 NULL。

要解决此问题,请使用该ISNULL函数为减法中的每个值返回 0 而不是 NULL。

祝你好运!

于 2013-08-27T13:45:16.993 回答
0

您将获得 [sumofnetsales] 的 Null 值,因为您在表 @InitialOrderDiscount( left join @InitialOrderDiscount id on id.ShortItemNo = ss.ShortItemNo ) 中没有匹配值。因此,为避免 NULL,您可以将列设为:

ISNULL(id.Amount,0)[SumOfNetSales]      
于 2013-08-27T13:47:38.203 回答