前N%描述和前M%Asc

时间:2016-02-13 14:58:48

标签: sql-server sql-server-2008 reporting-services ssrs-2008-r2 top-n

我正在尝试获得前5种自定义类型并显示每5种客户类型的数据,余额(可以是任何金额)我将其显示为"其他客户类型"。我的问题是,由于行可以是随机的,并且不能完全被数字整除,因此前5中的重复值可以显示在"其他"这一组夸大了总销售额。

数据也在SSRS中呈现

我的代码使用TOP PERCENT:

select final.[description], sum(final.YTDSales$) as YTDSales$

FROM(

select top 25 percent pytd2.[Description],  sum(pytd2.YTDSales$) as YTDSales$

FROM(


-- ytd sales

select re.SIC_Desc as [description],  sum((ol.NetAmt - ol.WhlOrdDiscAmt) / @exrt) AS YTDSales$

from dbo.order_line_invoice ol

INNER JOIN dbo.Vendor vd ON ol.Cono = vd.Cono AND vd.VendId = ol.VendId 
inner join Product_Warehouse pw on ol.ProdId = pw.prodid and ol.WhseId = pw.whseid and ol.cono = pw.cono 

inner join Customer c on ol.custId = c.CustId and ol.Cono = c.Cono

left join MDData.dbo.RetailEnvironment re on c.SIC = re.SIC
where ol.InvoiceDate BETWEEN @FStartDate AND @EndDate AND ol.Cono = 1 and ol.VendId IN(@Vendid) and ol.prodcatid NOT LIKE 'GP%'

group by re.SIC_Desc
)PYTD2      

group by pytd2.[description]

order by sum(pytd2.YTDSales$) DESC

UNION ALL

select top 75 percent 'Other' as 'description', sum(pytd.YTDSales$) as YTDSales$
FROM(

-- ytd sales

select re.SIC_Desc as [description], sum((ol.NetAmt - ol.WhlOrdDiscAmt) / @exrt) AS YTDSales$

from dbo.order_line_invoice ol

INNER JOIN dbo.Vendor vd ON ol.Cono = vd.Cono AND vd.VendId = ol.VendId 

inner join Product_Warehouse pw on ol.ProdId = pw.prodid and ol.WhseId = pw.whseid and ol.cono = pw.cono 

inner join Customer c on ol.custId = c.CustId and ol.Cono = c.Cono

left join MDData.dbo.RetailEnvironment re on c.SIC = re.SIC

where ol.InvoiceDate BETWEEN @FStartDate AND @EndDate AND ol.Cono = 1 and ol.VendId IN(@Vendid) and ol.prodcatid NOT LIKE 'GP%'

group by re.SIC_Desc
)PYTD       

group by Ppytd.[description]

order by sum(pytd.YTDSales$)    

)final                                      

group by final.[Description]

order by sum(final.YTDSales$) DESC

我的结果: As you can see the Large Independent and Other has the same figure of $2280.60 in YTDQty since it is being repeated

2 个答案:

答案 0 :(得分:1)

我正在想象这样的事情:

with data as (
    -- your base query here grouped and summarized by customer type
), rankedData as (
    select *, row_number() over (order by YTDSales$ desc) as CustTypeRank
    from data
)
select
   case when CustTypeRank <= 5 then min("description") else 'Others' end as "description",
   sum(YTDSales$) as YTDSales$
from rankedData
group by case when CustTypeRank <= 5 then CustTypeRank else 999 end
order by case when CustTypeRank <= 5 then CustTypeRank else 999 end

答案 1 :(得分:1)

我实际上使用的是RANK而不是很有效: -

select 0 as rankytd, RANK() OVER(ORDER BY sum(ol.NetAmt - ol.WhlOrdDiscAmt) DESC) as rankpytd, re.sic, ol.VendId, vd.name, re.SIC_Desc As [description], 0 AS YTDQty, sum(ol.Quantity) AS PYTDQty
from dbo.order_line_invoice ol
INNER JOIN dbo.Vendor vd ON ol.Cono = vd.Cono AND vd.VendId = ol.VendId  
inner join dbo.Product p on ol.Cono = p.Cono and ol.prodid = p.ProdId and p.ProdCatId in (@pcat)
inner join Product_Warehouse pw on ol.ProdId = pw.prodid and ol.WhseId = pw.whseid and ol.cono = pw.cono 
inner join Customer c on ol.custId = c.CustId and ol.Cono = c.Cono
left join MDData.dbo.RetailEnvironment re on c.SIC = re.SIC  
where ol.InvoiceDate BETWEEN DATEADD(YEAR, -1,@FStartDate) AND DATEADD(YEAR, -1, @EndDate) and  ol.Cono = 1  and ol.VendId IN(@Vendid) and ol.prodcatid NOT LIKE 'GP%' 
group by re.sic, ol.VendId, vd.Name,  re.SIC_Desc