2016-04-13 13 views
1

私はこのような結果セットを取得するには、このクエリT-SQL:1つの以上の行を持って選択したパーティション

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)、顧客、顧客の売上、およびグループと製品IDで区切られたシーケンス番号。

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です。このようになり、私はあなたのクエリを変更します

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 
+0

がで、その後1つのより外側のクエリと注文をレイヤーすることができるはずですalliased t.seqnum。あなたはインナーオーダーを落とさなければならない。 – PCSgtL

答えて

2

+0

ありがとう、これは私が探しているようだが、Sqlサーバーでは、HAVING内でエイリアス化された 'cnt'を参照することはできません。私はちょうど別の選択で選択をラップすると 'どこcnt> 1'を行う必要がありますか? –

+0

はい、してください。私はあなたのテーブル構造やSQL Serverを手元に持っていないので、それをテストする方法はありません。 –

0

あなたのような何かを試すことができ

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 
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; 
関連する問題