如何计算列的平均值,然后将其包含在SQL中的选择查询中

时间:2013-05-24 07:04:48

标签: sql sql-server-2008

我有一个查询结果,如下所示

saledate    Amount    TRVal
20/05/2013  $6250.78  4
21/05/2013  $4562.23  4
22/05/2013  $565.32   6
23/05/2013  $85.36    8
24/05/2013  $56.36    5

我希望数量的平均值如

saledate    Amount    TRVal  AvgVal
20/05/2013  $6250.78  4      2304.01
21/05/2013  $4562.23  4      2304.01
22/05/2013  $565.32   6      2304.01
23/05/2013  $85.36    8      2304.01
24/05/2013  $56.36    5      2304.01

我知道要计算平均值,但我希望它包含在查询结果中。

我正在使用的查询是

    Select ISNULL([SaleDate],'Totals') AS [Totals], TempSaleDate, Domestic, Export, Import, TotalJobs,
                  '$' + CAST(CAST(Value AS DECIMAL(10,2)) AS VARCHAR(15)) Value, 
                  '$' + CAST(CAST(ValueNOGST AS DECIMAL(10,2)) AS VARCHAR(15)) ValueNOGST, 
                  Cancelled,
                  '$' + CAST(CAST(CancelledValue AS DECIMAL(10,2)) AS VARCHAR(15)) CancelledValue,
                  '$' + CAST(CAST(CancelledValueNOGST AS DECIMAL(10,2)) AS VARCHAR(15)) CancelledValueNOGST,
                  '$' + CAST(CAST(TotalValue AS DECIMAL(10,2)) AS VARCHAR(15)) TotalValue,
                  '$' + CAST(CAST(TotalValueNOGST AS DECIMAL(10,2)) AS VARCHAR(15)) TotalValueNOGST,
                  (select AVG(TotalValue) from sales) as FFF,
                  TotalGST, TotalValue+TotalGST TotalWithNOGSTCheck

                  FROM (

                    select convert(varchar(10), sales.saledate, 103) [SaleDate],max(sales.SaleDate) [TempSaleDate], SUM(sales.Domestic) [Domestic], SUM(sales.Export) [Export], SUM(sales.Import) [Import], 
                    (SUM(sales.Domestic) + SUM(sales.Export) + SUM(sales.Import)) AS TotalJobs,
                    SUM(sales.Value) [Value], SUM(sales.ValueNoGST) [ValueNOGST],
                    Sum(sales.Cancelled) [Cancelled], 
                    sum(sales.cancelledValue) [CancelledValue],
                    sum(sales.CancelledValueNOGST) [CancelledValueNOGST],
                    SUM(sales.totalValue) [TotalValue],
                     SUM(sales.TotalValueNOGST) [TotalValueNOGST],
                    SUM(sales.FGST) [FreightGST],SUM(sales.WGST) [WarrantyGST],SUM(sales.TGST) [TotalGST]
                    from
                    (
                    select TOP 100 PERCENT max(j.SaleDate) SaleDate,
                    case when max(oc.Code) = 'AU' and max(dc.Code) = 'AU' then 1 else 0 end [Domestic],
                    case when max(oc.Code) = 'AU' and max(dc.Code) <> 'AU' then 1 else 0 end [Export],
                    case when max(oc.Code) <> 'AU' and max(dc.Code) = 'AU' then 1 else 0 end [Import],
                    1 [Total],
                    MAX(charges.FreightGst) [FGST],
                    MAX(charges.warrantygst) [WGST],
                    MAX(charges.totalgst) [TGST],
                    max(ic.Total-charges.totalgst) [Value],
                      max(ic.Total) [ValueNoGST],
                    case when max(c.CancelDate) is not null then 1 else 0 end [Cancelled],

                    case when max(c.CancelDate) is not null then max(ic.Total) else 0 end [CancelledValueNOGST],
                    case when max(c.CancelDate) is null then max(ic.Total) else 0 end [TotalValueNOGST],

                    case when max(c.CancelDate) is not null then max(ic.Total-charges.totalgst) else 0 end [CancelledValue],
                    case when max(c.CancelDate) is null then max(ic.Total-charges.totalgst) else 0 end [TotalValue]
                    from invoices i
                    left join Jobs j on i.JobKey = j.JobKey
                    inner join tasks t on j.jobkey = t.jobkey
                    inner join Consignments c on t.TaskKey = c.consignmentkey
                    inner join places op on c.originplacekey = op.placekey
                    inner join places dp on c.destinationplacekey = dp.placekey
                    inner join places oC on dbo.ParentPlaceKey(c.originPlaceKey) = oc.placekey
                    inner join places dC on dbo.ParentPlaceKey(c.destinationplacekey) = dc.placekey
                    left join (select consignmentKey, sum(Value) [Value] from ConsignmentItems ci group by consignmentkey ) ci on ci.ConsignmentKey = c.ConsignmentKey
                    left join (
                    select invoicekey, 
                    sum(case when ci.ChargeItemKey = 'FRT_SLL' then oc.Value else 0 end) [Freight], 
                    sum(case when ci.ChargeItemKey = 'WTY_SLL' then oc.Value else 0 end) [Warranty],
                    sum(case when ci.ChargeType = 4 then oc.Value else 0 end) [Total]
                    from InvoiceCharges ic
                    left join OptionCharges oc on ic.OptionChargeKey = oc.OptionChargeKey
                    left join ChargeItems ci on oc.ChargeItemKey = ci.ChargeItemKey
                    group by invoicekey
                    ) ic on ic.invoicekey = i.InvoiceKey

                   left join (
                    select OptionKey [OptionKey], 
                    sum(case when ci1.ChargeItemKey = 'FRT_TX1' then oc1.Value else 0 end) [FreightGst], 
                    sum(case when ci1.ChargeItemKey = 'WTY_TX1' then oc1.Value else 0 end) [WarrantyGst],
                    sum(case when ci1.ChargeType = 3 then oc1.Value else 0 end) [TotalGst] 
                    from OptionCharges oc1
                    left join ChargeItems ci1 on oc1.ChargeItemKey = ci1.ChargeItemKey
                    group by optionkey
                    ) charges on charges.OptionKey = c.SelectedOptionKey


                    where 
                    j.SaleDate >= '20-May-2013'
                    and
                    j.operationalstorekey = dbo.StoreCode('AU-WEB')
                    and j.saledate is not null and SelectedOptionKey is not null
                    group by j.jobkey
                    ) sales
                    group by convert(varchar(10), sales.saledate, 103) WITH ROLLUP
                    ) AS SalesData order by TempSaleDate

我尝试添加

 (SELECT avg(TotalValue) FROM SalesData) as avgVal

但抛出invalid object name SalesData

不确定我做错了什么。

3 个答案:

答案 0 :(得分:3)

在聚合SUM上使用窗口化AVG。

SELECT
    DATEADD(dd, DATEDIFF(dd, 0, saledate), 0)
    , SUM(something) AS Amount
    , ?? AS TRVal -- no idea what it is
    , AVG(SUM(something)) OVER () AS AvgVal
FROM MyTable -- or whatever
GROUP BY DATEDIFF(dd, 0, saledate)

答案 1 :(得分:2)

SELECT saledate, Amount, TRVal, (SELECT avg(amount) FROM tableA) as AvgVal FROM tableA

SELECT saledate, Amount, TRVal, avgVal FROM tableA
INNER JOIN (SELECT avg(amount) as AvgVal FROM tableA) x

已编辑添加:

您必须将SalesData替换为您要查询的表的名称(您从示例中删除了该表:

FROM(
-- whatever name you put here is the one you need in place of SalesData
)

已编辑添加:

您的FROM子句很复杂,因此MSSQL 2008为这种情况添加了WITH子句:

;WITH thisTable AS (
    -- put your FROM clause in here
)
SELECT /* list of fields */, (SELECT AVG(amount) FROM thisTable) as AvgVal
FROM thisTable

所以对你:

; WITH thisTable AS (
select convert(varchar(10), sales.saledate, 103) [SaleDate],max(sales.SaleDate) [TempSaleDate],
    SUM(sales.Domestic) [Domestic], SUM(sales.Export) [Export], SUM(sales.Import) [Import], 
    (SUM(sales.Domestic) + SUM(sales.Export) + SUM(sales.Import)) AS TotalJobs,
    SUM(sales.Value) [Value], SUM(sales.ValueNoGST) [ValueNOGST],
    Sum(sales.Cancelled) [Cancelled], 
    sum(sales.cancelledValue) [CancelledValue],
    sum(sales.CancelledValueNOGST) [CancelledValueNOGST],
                SUM(sales.totalValue) [TotalValue],
                 SUM(sales.TotalValueNOGST) [TotalValueNOGST],
    SUM(sales.FGST) [FreightGST],SUM(sales.WGST) [WarrantyGST],SUM(sales.TGST) [TotalGST]
from
(
    select TOP 100 PERCENT max(j.SaleDate) SaleDate,
    case when max(oc.Code) = 'AU' and max(dc.Code) = 'AU' then 1 else 0 end [Domestic],
    case when max(oc.Code) = 'AU' and max(dc.Code) <> 'AU' then 1 else 0 end [Export],
    case when max(oc.Code) <> 'AU' and max(dc.Code) = 'AU' then 1 else 0 end [Import],
    1 [Total],
                MAX(charges.FreightGst) [FGST],
                MAX(charges.warrantygst) [WGST],
                MAX(charges.totalgst) [TGST],
                max(ic.Total-charges.totalgst) [Value],
                  max(ic.Total) [ValueNoGST],
    case when max(c.CancelDate) is not null then 1 else 0 end [Cancelled],

    case when max(c.CancelDate) is not null then max(ic.Total) else 0 end [CancelledValueNOGST],
    case when max(c.CancelDate) is null then max(ic.Total) else 0 end [TotalValueNOGST],

    case when max(c.CancelDate) is not null then max(ic.Total-charges.totalgst) else 0 end [CancelledValue],
    case when max(c.CancelDate) is null then max(ic.Total-charges.totalgst) else 0 end [TotalValue]
                from invoices i
                left join Jobs j on i.JobKey = j.JobKey
                inner join tasks t on j.jobkey = t.jobkey
                inner join Consignments c on t.TaskKey = c.consignmentkey
                inner join places op on c.originplacekey = op.placekey
                inner join places dp on c.destinationplacekey = dp.placekey
                inner join places oC on dbo.ParentPlaceKey(c.originPlaceKey) = oc.placekey
                inner join places dC on dbo.ParentPlaceKey(c.destinationplacekey) = dc.placekey
                left join (select consignmentKey, sum(Value) [Value] from ConsignmentItems ci group by consignmentkey ) ci on ci.ConsignmentKey = c.ConsignmentKey
                left join (
                select invoicekey, 
                sum(case when ci.ChargeItemKey = 'FRT_SLL' then oc.Value else 0 end) [Freight], 
                sum(case when ci.ChargeItemKey = 'WTY_SLL' then oc.Value else 0 end) [Warranty],
                sum(case when ci.ChargeType = 4 then oc.Value else 0 end) [Total]
                from InvoiceCharges ic
                left join OptionCharges oc on ic.OptionChargeKey = oc.OptionChargeKey
                left join ChargeItems ci on oc.ChargeItemKey = ci.ChargeItemKey
                group by invoicekey
                ) ic on ic.invoicekey = i.InvoiceKey

               left join (
                select OptionKey [OptionKey], 
                sum(case when ci1.ChargeItemKey = 'FRT_TX1' then oc1.Value else 0 end) [FreightGst], 
                sum(case when ci1.ChargeItemKey = 'WTY_TX1' then oc1.Value else 0 end) [WarrantyGst],
                sum(case when ci1.ChargeType = 3 then oc1.Value else 0 end) [TotalGst] 
                from OptionCharges oc1
                left join ChargeItems ci1 on oc1.ChargeItemKey = ci1.ChargeItemKey
                group by optionkey
                ) charges on charges.OptionKey = c.SelectedOptionKey


                where 
                j.SaleDate >= '20-May-2013'
                and
                j.operationalstorekey = dbo.StoreCode('AU-WEB')
                and j.saledate is not null and SelectedOptionKey is not null
                group by j.jobkey
                ) sales
                group by convert(varchar(10), sales.saledate, 103) WITH ROLLUP
                )
/* end of definition of thisTable */ 
)
/* here's your select */
Select ISNULL([SaleDate],'Totals') AS [Totals], TempSaleDate, Domestic, Export, Import, TotalJobs,
              '$' + CAST(CAST(Value AS DECIMAL(10,2)) AS VARCHAR(15)) Value, 
              '$' + CAST(CAST(ValueNOGST AS DECIMAL(10,2)) AS VARCHAR(15)) ValueNOGST, 
              Cancelled,
              '$' + CAST(CAST(CancelledValue AS DECIMAL(10,2)) AS VARCHAR(15)) CancelledValue,
              '$' + CAST(CAST(CancelledValueNOGST AS DECIMAL(10,2)) AS VARCHAR(15)) CancelledValueNOGST,
              '$' + CAST(CAST(TotalValue AS DECIMAL(10,2)) AS VARCHAR(15)) TotalValue,
              '$' + CAST(CAST(TotalValueNOGST AS DECIMAL(10,2)) AS VARCHAR(15)) TotalValueNOGST,
/* here's the AVG() */
              (select AVG(TotalValue) from thisTable) as FFF,
              TotalGST, TotalValue+TotalGST TotalWithNOGSTCheck,

FROM thisTable

答案 2 :(得分:2)

这是最简单的代码。如果它太慢,可以进行优化......

select saledate, amount, trval, (select avg(amount) from  yourtable) as AvgVal from yourtable;