T-SQL:选择包含多行的分区

时间:2016-04-13 18:02:17

标签: sql sql-server tsql

我设法使用此查询

SELECT 
    PartGrp,VendorPn, customer, sum(sales) as totalSales,
    ROW_NUMBER() OVER (PARTITION BY partgrp, vendorpn ORDER BY SUM(sales) DESC) AS seqnum
FROM 
    BG_Invoice 
GROUP BY 
    PartGrp, VendorPn, customer
ORDER BY 
    PartGrp, VendorPn, totalSales DESC

获得这样的结果集。按组分组的销售记录列表,产品ID(VendorPn),客户,客户的销售额,以及按组和productID分区的序列号。

PartGrp     VendorPn        Customer    totalSales seqnum
------------------------------------------------------------
AGS-AS      002A0002-252    10021013    19307.00    1
AGS-AS      002A0006-86     10021013    33092.00    1
AGS-AS      010-63078-8     10020987    10866.00    1
AGS-SQ      B71040-39       10020997     7174.00    1
AGS-SQ      B71040-39       10020998        2.00    2
AIRFRAME    0130-25         10017232     1971.00    1
AIRFRAME    0130-25         10000122     1243.00    2
AIRFRAME    0130-25         10008637      753.00    3
HARDWARE    MS28775-261     10005623      214.00    1
M250        23066682        10013266      175.00    1

如何将结果集过滤为仅返回超过1 seqnum的行?我希望结果集看起来像这样

PartGrp     VendorPn        Customer    totalSales seqnum
------------------------------------------------------------
AGS-SQ      B71040-39       10020997    7174.00     1
AGS-SQ      B71040-39       10020998       2.00     2
AIRFRAME    0130-25         10017232    1971.00     1
AIRFRAME    0130-25         10000122    1243.00     2
AIRFRAME    0130-25         10008637     753.00     3

在第一个结果集示例中,只有行VendorPn" B71040-39"和" 0130-25"有多个客户购买该产品。所有只有1位客户的产品被删除。请注意,我想要的结果集不仅仅是seqnum > 1,因为我仍然需要每个分区的第一个seqnum

3 个答案:

答案 0 :(得分:3)

我会将您的查询更改为:

SELECT PartGrp,
       VendorPn,
       customer,
       sum(sales) as totalSales,
       ROW_NUMBER() OVER (PARTITION BY partgrp,vendorpn ORDER BY SUM(sales) DESC) as seqnum,
       COUNT(1) OVER (PARTITION BY partgrp,vendorpn) as cnt
FROM BG_Invoice 
GROUP BY PartGrp,VendorPn, customer
HAVING cnt > 1
ORDER BY PartGrp,VendorPn, totalSales desc

答案 1 :(得分:0)

您可以尝试以下内容:

SELECT PartGrp,VendorPn, customer, sum(sales) as totalSales,
ROW_NUMBER() OVER (PARTITION BY partgrp,vendorpn ORDER BY SUM(sales) DESC) as seqnum
FROM BG_Invoice 
GROUP BY PartGrp,VendorPn, customer
HAVING seqnum <> '1'
ORDER BY PartGrp,VendorPn, totalSales desc

答案 2 :(得分:0)

WITH CTE AS (
    SELECT 
        PartGrp,VendorPn, customer, sum(sales) as totalSales,
        ROW_NUMBER() OVER (PARTITION BY partgrp, vendorpn ORDER BY SUM(sales) DESC) AS seqnum
    FROM 
        BG_Invoice 
    GROUP BY 
        PartGrp, VendorPn, customer)
SELECT DISTINCT
    a.*
FROM
    CTE a
JOIN
    CTE b
        ON a.PartGrp = b.PartGrp
        AND a.VendorPn = b.VendorPn
WHERE
    b.seqnum > 1
ORDER BY 
    a.PartGrp,
    a.VendorPn,
    a.totalSales DESC;