【问题标题】:how to select top 10 without duplicates如何选择没有重复的前 10 名
【发布时间】:2016-07-22 16:45:48
【问题描述】:

使用 SQL Server 2012 我需要根据 ProducerCode 选择 TOP 10 Producer。但是数据混乱了,用户输入了相同的 Producer,只是拼写不同,使用相同的 ProducerCode。 所以我只需要 TOP 10,所以如果 ProducerCode 重复,我只想选择列表中的第一个。 我怎样才能做到这一点?

我的数据样本

        ;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

【问题讨论】:

  • 这可能对您有用。 w3schools.com/sql/sql_distinct.asp
  • 我这样做了,但我还必须带上 ProducerName,那就是一切都出错了,因为 ProducerName 列有相同的生产者,只是拼写错误
  • 那么也许这就是你要找的东西? dba.stackexchange.com/a/22198
  • 谢谢大佬,看来可以了!!!

标签: tsql reporting-services sql-server-2012


【解决方案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;  

【讨论】:

    【解决方案2】:

    你可以这样做:

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

    【讨论】:

      猜你喜欢
      • 2018-09-20
      • 1970-01-01
      • 2021-12-05
      • 1970-01-01
      • 2012-03-09
      • 1970-01-01
      • 2015-03-04
      • 2015-10-12
      • 2019-01-07
      相关资源
      最近更新 更多