脚本帮助 - 计数,总计和平均值

时间:2017-05-29 11:43:44

标签: sql sql-server sql-server-2012

我有以下脚本,试图计算有多少不同的客户,有多少不同的订单,15英镑以下的所有订单总数及其平均值,超过20英镑的订单总数以及它的平均值。

with consignments as 
(select 
[Sell-to Customer No_],
[Convert-to Document No_],
ic.[Shipping Agent Service Code],
[Pick Completed DateTime] as [Shipped DateTime],
ROUND((ic.[Amount Including VAT] + ic.Postage + ic.[Gift Wrap Price] + 
ic.[Handling Fee] + ic.[Personalisation Fee]),2) as [Document Amount]   
from dbo.[Temp$Consignment] ic inner join [dbo].
[Temp$Order] oh 
on ic.[Owner Header GuID]=oh.[Order Guid]       
where ic.[Shipping Agent Service Code]='secstan' and ic.[Pick Completed 
DateTime] >= '2016-11-01T00:00:00.000' AND 
ic.[Pick Completed DateTime] <= '2016-11-30T23:59:55.000' ),summary as 
(select *,CASE WHEN [Document Amount] > 15 THEN 1 ELSE 0 END as 'Over15' 
from consignments )select * from summary

我有下面的工作脚本,但由于我是sql的新手,我有点困惑如何将上面的脚本转换为下面。

   select amountclass,[Shipping Agent Service Code],
   count(distinct [Sell-to Customer No_]) as Total_customers,
   count(*) as Total_orders,
   sum([Amount]) as total_revenue,
   avg([Amount] * 1.0) as AOV
   from
  (
  select [Sell-to Customer No_], oh.[Original Order No_], [Amount],ic.
  [Shipping Agent Service Code],
       case when [Amount] <= 20 then 'Under_20'
            else 'Over_20'
       end as amountclass
 from [TBW_BI].[dbo].[Temp$Order] oh INNER JOIN [TBW_BI].[dbo].
  [Temp$Consignment] IC
 ON IC.[Owner Header GuID]=OH.[Order Guid]
where[order date] >= '2016-09-01' AND 
    [order date] <= '2016-09-30' AND  [COUNTRY]='UNITED KINGDOM' and 
 [document type] like 'ord%' and ic.[Shipping Agent Service 
 Code]='secstan'
 ) dt

 group by amountclass,[Shipping Agent Service Code]
  order by amountclass,[Shipping Agent Service Code]

1 个答案:

答案 0 :(得分:0)

看起来您有一个带有2个公用表表达式(CTE)的查询,并且您希望将CTE转换为派生表。首先,我们可以消除其中一个CTE。

summary as 
(select *,CASE WHEN [Document Amount] > 15 THEN 1 ELSE 0 END as 'Over15' 
 from consignments )

select * from summary

汇总的CTE是不必要的。我们可以将该代码转换为:

select *,CASE WHEN [Document Amount] > 15 THEN 1 ELSE 0 END as 'Over15' 
from consignments

现在,而不是使用货物CTE;我们可以复制其中的sql代码来创建派生表。

select *,CASE WHEN [Document Amount] > 15 THEN 1 ELSE 0 END as 'Over15' 
from (
    select [Sell-to Customer No_],
            [Convert-to Document No_],
            ic.[Shipping Agent Service Code],
            [Pick Completed DateTime] as [Shipped DateTime],
            ROUND((ic.[Amount Including VAT] + ic.Postage + ic.[Gift Wrap Price] + 
             ic.[Handling Fee] + ic.[Personalisation Fee]),2) as [Document Amount]   
    from dbo.[Temp$Consignment] ic 
            inner join [dbo].[Temp$Order] oh on ic.[Owner Header GuID]=oh.[Order Guid]       
    where ic.[Shipping Agent Service Code]='secstan' 
            and ic.[Pick Completed 
            DateTime] >= '2016-11-01T00:00:00.000' 
            AND 
        ic.[Pick Completed DateTime] <= '2016-11-30T23:59:55.000' ) as t