2016-07-22 18 views
0

使用SQL Server 2012 我需要選擇基於ProducerCode的TOP 10 Producer。但是數據混亂了,用戶輸入的生產者只是拼寫不同而且生產者代碼相同。 所以我只需要TOP 10,所以如果ProducerCode重複,我只想選擇列表中的第一個。 我該如何做到這一點? enter image description here如何選擇沒有重複的前10名

我的數據

 ;WITH cte_TopWP --T 
AS 
    (
     SELECT distinct ProducerCode, Producer,SUM(premium) as NetWrittenPremium, 
     SUM(CASE WHEN PolicyType = 'New Business' THEN Premium ELSE 0 END) as NewBusiness1, 
     SUM(CASE WHEN PolicyType = 'Renewal' THEN Premium ELSE 0 END) as Renewal1, 
     SUM(CASE WHEN PolicyType = 'Rewrite' THEN Premium ELSE 0 END) as Rewrite1 

     FROM ProductionReportMetrics 
     WHERE YEAR(EffectiveDate) = 2016 AND TransactionType = 'Policy' AND CompanyLine = 'Arch Insurance Company'--AND ProducerType = 'Wholesaler' 
     GROUP BY ProducerCode,Producer 
    ) 
    , 
    cte_Counts --C 
AS 
    (
     SELECT distinct ProducerCode, ProducerName, COUNT (distinct ControlNo) as Submissions2, 
     SUM(CASE WHEN QuotedPremium IS NOT NULL THEN 1 ELSE 0 END) as Quoted2, 
     SUM(CASE WHEN Type = 'New Business' AND Status IN ('Bound','Cancelled','Notice of Cancellation') THEN 1 ELSE 0 END) as NewBusiness2, 
     SUM(CASE WHEN Type = 'Renewal'  AND Status IN ('Bound','Cancelled','Notice of Cancellation') THEN 1 ELSE 0 END) as Renewal2, 
     SUM(CASE WHEN Type = 'Rewrite'  AND Status IN ('Bound','Cancelled','Notice of Cancellation') THEN 1 ELSE 0 END) as Rewrite2, 
     SUM(CASE WHEN Status = 'Declined' THEN 1 ELSE 0 END) as Declined2 
     FROM ClearanceReportMetrics 
     WHERE YEAR(EffectiveDate)=2016 AND CompanyLine = 'Arch Insurance Company' 
     GROUP BY ProducerCode,ProducerName 
    ) 


SELECT  top 10 RANK() OVER (ORDER BY NetWrittenPremium desc) as Rank, 
      t.ProducerCode, 
      c.ProducerName as 'Producer', 
      NetWrittenPremium, 
      t.NewBusiness1, 
      t.Renewal1, 
      t.Rewrite1, 
      c.[NewBusiness2]+c.[Renewal2]+c.[Rewrite2] as PolicyCount, 
      c.Submissions2, 
      c.Quoted2, 
      c.[NewBusiness2], 
      c.Renewal2, 
      c.Rewrite2, 
      c.Declined2   
FROM  cte_TopWP t --LEFT OUTER JOIN tblProducers p on t.ProducerCode=p.ProducerCode 
         LEFT OUTER JOIN cte_Counts c ON t.ProducerCode=c.ProducerCode 
+0

這可能對您有用。 http://www.w3schools.com/sql/sql_distinct.asp – Danieboy

+0

我這樣做了,但我也必須帶ProducerName,那就是當一切都出錯了,因爲列ProducerName有相同的生產者只是拼寫錯誤 – Oleg

+0

然後,也許這就是你在爲我打氣嗎? http://dba.stackexchange.com/a/22198 – Danieboy

回答

1

您應該使用ROW_NUMBER來解決您的問題。

https://msdn.microsoft.com/en-us/library/ms186734.aspx

的一個很好的例子是如下回答:

https://dba.stackexchange.com/a/22198

下面是答案的代碼示例。

SELECT * FROM 
(
    SELECT acss_lookup.ID AS acss_lookupID, 
    ROW_NUMBER() OVER 
    (PARTITION BY your_distinct_column ORDER BY any_column_you_think_is_appropriate) 
    as num, 
    acss_lookup.product_lookupID AS acssproduct_lookupID, 
    acss_lookup.region_lookupID AS acssregion_lookupID, 
    acss_lookup.document_lookupID AS acssdocument_lookupID, 
    product.ID AS product_ID, 
    product.parent_productID AS productparent_product_ID, 
    product.label AS product_label, 
    product.displayheading AS product_displayheading, 
    product.displayorder AS product_displayorder, 
    product.display AS product_display, 
    product.ignorenewupdate AS product_ignorenewupdate, 
    product.directlink AS product_directlink, 
    product.directlinkURL AS product_directlinkURL, 
    product.shortdescription AS product_shortdescription, 
    product.logo AS product_logo, 
    product.thumbnail AS product_thumbnail, 
    product.content AS product_content, 
    product.pdf AS product_pdf, 
    product.language_lookupID AS product_language_lookupID, 
    document.ID AS document_ID, 
    document.shortdescription AS document_shortdescription, 
    document.language_lookupID AS document_language_lookupID, 
    document.document_note AS document_document_note, 
    document.displayheading AS document_displayheading 
    FROM acss_lookup 
     INNER JOIN product ON (acss_lookup.product_lookupID = product.ID) 
     INNER JOIN document ON (acss_lookup.document_lookupID = document.ID) 
)a 
WHERE a.num = 1 
ORDER BY product_displayheading ASC; 
0

的樣品你可以這樣做:

SELECT ProducerCode, MIN(Producer) AS Producer, ... 
GROUP BY ProducerCode