2016-07-22 10 views
0

Verwenden von SQL Server 2012 Ich muss TOP 10 Producer basierend auf einem ProducerCode auswählen. Aber die Daten sind durcheinander, Benutzer haben die gleichen Produzenten eingegeben, die nur anders geschrieben wurden und mit dem gleichen ProducerCode. Also ich brauche nur TOP 10, also, wenn der ProducerCode wiederholt, möchte ich nur den ersten in einer Liste auswählen. Wie kann ich das erreichen? enter image description hereSo wählen Sie die Top 10 ohne Duplikate

Probe meiner Daten

 ;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

Dies könnte für Sie nützlich sein. http://www.w3schools.com/sql/sql_distinct.asp – Danieboy

+0

Ich tat das, aber ich muss ProducerName auch bringen, und das ist, wenn alles schief geht, weil column ProducerName dieselben Produzenten nur falsch geschrieben haben – Oleg

+0

Dann ist das vielleicht was du suchst nach? http://dba.stackexchange.com/a/22198 – Danieboy

Antwort

1

sollten Sie ROW_NUMBER benutzen, um Ihr Problem zu beheben.

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

Ein gutes Beispiel hierfür ist die folgende Antwort:

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

Hier ist das Codebeispiel aus der Antwort.

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

Sie dies tun könnten:

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