在订购每个查询时联合所有2个查询

Kev*_*vin 0 t-sql sql-server sql-server-2008-r2

我如何将所有2个查询联合起来,但在将所有查询合并之前对每个查询进行排序?我希望在结果按总和([docextprice])desc命令后的每一年获得前20名的结果

这是我现在拥有的一个例子:

SELECT      top 20 gm.[partnum]
            ,p.PartDescription
            ,sum([docextprice])[docextprice]
            ,year([invoicedate])year
            ,'Eco Surfaces' product

FROM        dbo.gm gm
            JOIN dbo.Part p on gm.partnum = p.PartNum

WHERE       gm.company = 'EII' and [invoicedate] BETWEEN  '20100809' and '20101231'
            and p.ClassID in ('mpe') 


GROUP BY    year([invoicedate]),gm.[partnum],p.PartDescription
ORDER BY    year([invoicedate]),sum([docextprice]) desc

UNION ALL

SELECT      top 20 gm.[partnum]
            ,p.PartDescription
            --,gm.[prodcode]
            --,p.ClassID
            ,sum([docextprice])[docextprice]
            ,year([invoicedate])year
            ,'Eco Surfaces' product

FROM        dbo.gm gm
            JOIN dbo.Part p on gm.partnum = p.PartNum

WHERE       gm.company = 'EII' and [invoicedate] BETWEEN  '20110101' and '20111231'
            and p.ClassID in ('mpe') 


GROUP BY    year([invoicedate]),gm.[partnum],p.PartDescription
ORDER BY    year([invoicedate]),sum([docextprice]) desc
Run Code Online (Sandbox Code Playgroud)

显然,这个查询不会因为你不能在连接的两边进行排序.

Dav*_*ugg 5

您可以通过使用公用表表达式来保存结果,然后将它们组合在一起:

WITH    cte1
          AS ( SELECT TOP 20
                        gm.[partnum] ,
                        p.PartDescription ,
                        SUM([docextprice]) [docextprice] ,
                        YEAR([invoicedate]) year ,
                        'Eco Surfaces' product
               FROM     dbo.gm gm
                        JOIN dbo.Part p ON gm.partnum = p.PartNum
               WHERE    gm.company = 'EII'
                        AND [invoicedate] BETWEEN '20100809' AND '20101231'
                        AND p.ClassID IN ( 'mpe' )
               GROUP BY YEAR([invoicedate]) ,
                        gm.[partnum] ,
                        p.PartDescription
               ORDER BY YEAR([invoicedate]) ,
                        SUM([docextprice]) DESC
             ),
        cte2
          AS ( SELECT TOP 20
                        gm.[partnum] ,
                        p.PartDescription
                        --,gm.[prodcode]
                        --,p.ClassID
                        ,
                        SUM([docextprice]) [docextprice] ,
                        YEAR([invoicedate]) year ,
                        'Eco Surfaces' product
               FROM     dbo.gm gm
                        JOIN dbo.Part p ON gm.partnum = p.PartNum
               WHERE    gm.company = 'EII'
                        AND [invoicedate] BETWEEN '20110101' AND '20111231'
                        AND p.ClassID IN ( 'mpe' )
               GROUP BY YEAR([invoicedate]) ,
                        gm.[partnum] ,
                        p.PartDescription
               ORDER BY YEAR([invoicedate]) ,
                        SUM([docextprice]) DESC
             )
    SELECT  *
    FROM    cte1
    UNION ALL
    SELECT  *
    FROM    cte2
Run Code Online (Sandbox Code Playgroud)