Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server:从每年的金额中选择前10名_Sql_Sql Server 2012 - Fatal编程技术网

SQL Server:从每年的金额中选择前10名

SQL Server:从每年的金额中选择前10名,sql,sql-server-2012,Sql,Sql Server 2012,我有一个项目清单,我想按年度列出前10个项目。最好的方法是什么?我正在运行SQL Server 2012 这就是我到目前为止所做的: SELECT DISTINCT YEAR(b.DateOfServiceLast) AS 'Year', MONTH(b.DateOfServiceLast) AS 'Month', b.DiagnosisCode, SUM(c.Paid) OVER (PARTITION BY YEAR(b.DateOfServiceLast),

我有一个项目清单,我想按年度列出前10个项目。最好的方法是什么?我正在运行SQL Server 2012

这就是我到目前为止所做的:

SELECT DISTINCT
    YEAR(b.DateOfServiceLast)  AS 'Year',
    MONTH(b.DateOfServiceLast) AS 'Month',
    b.DiagnosisCode,
    SUM(c.Paid) OVER (PARTITION BY YEAR(b.DateOfServiceLast), MONTH(b.DateOfServiceLast), (b.DiagnosisCode)) AS 'Cost',
    ROW_NUMBER() OVER (PARTITION BY YEAR(b.DateOfServiceLast), MONTH(b.DateOfServiceLast) ORDER BY YEAR(b.DateOfServiceLast), MONTH(b.DateOfServiceLast)) AS 'Row'
FROM
    MO_CMTExtract.dbo.ProfessionalClaim a
LEFT JOIN
    MO_CMTExtract.dbo.ProfessionalClaimDetail b ON a.ProfessionalClaimID = b.ProfessionalClaimID
LEFT JOIN
    MO_CMTExtract.dbo.ProfessionalClaimDetailMoney c ON b.ProfessionalClaimDetailID = c.ProfessionalClaimDetailID
ORDER BY
    YEAR(b.DateOfServiceLast),
    MONTH(b.DateOfServiceLast),
    b.DiagnosisCode,
    Row, Cost;
您可以按如下方式使用行号,然后使用行号进行过滤:

WITH cte_base
AS (   SELECT  DISTINCT
               YEAR(b.DateOfServiceLast)  AS 'Year',
               MONTH(b.DateOfServiceLast) AS 'Month',
               b.DiagnosisCode,
               SUM(c.Paid) OVER (PARTITION BY
                                     YEAR(b.DateOfServiceLast),
                                     MONTH(b.DateOfServiceLast),
                                     (b.DiagnosisCode)
                                )         AS 'Cost'
       FROM
               MO_CMTExtract.dbo.ProfessionalClaim            a
           LEFT JOIN
               MO_CMTExtract.dbo.ProfessionalClaimDetail      b
                   ON a.ProfessionalClaimID = b.ProfessionalClaimID
           LEFT JOIN
               MO_CMTExtract.dbo.ProfessionalClaimDetailMoney c
                   ON b.ProfessionalClaimDetailID = c.ProfessionalClaimDetailID),
     cte_rownum
AS (   SELECT
           cte_base.Year,
           cte_base.Month,
           cte_base.Cost,
           cte_base.Row,
           ROW_NUMBER() OVER (PARTITION BY
                                  YEAR(b.DateOfServiceLast)
                              ORDER BY
                                  cte_base.Cost DESC
                             ) AS 'Rownum'
       FROM
           cte_base)
SELECT
    *
FROM
    cte_rownum
WHERE
    cte_rownum.Rownum <= 10
ORDER BY
    cte_rownum.Year,
    cte_rownum.Month,
    cte_rownum.Cost DESC;
使用领带是一种方法。我保留了您的查询,但将其包装在CTE中,并通过删除订单。然后,我们用系带来对抗那个CTE


你能提供一些样本数据和期望的结果吗?@marc_你的评论让Jackson 5的abc变得简单,因为123首歌卡在我的脑海里了D
WITH CTE AS(
SELECT DISTINCT
        YEAR(b.DateOfServiceLast)  AS 'Year',
        MONTH(b.DateOfServiceLast) AS 'Month',
        b.DiagnosisCode,
        SUM(c.Paid) OVER (PARTITION BY
                              YEAR(b.DateOfServiceLast),
                              MONTH(b.DateOfServiceLast),
                              (b.DiagnosisCode)
                         )         AS 'Cost',
        ROW_NUMBER() OVER (PARTITION BY
                               YEAR(b.DateOfServiceLast),
                               MONTH(b.DateOfServiceLast)
                           ORDER BY
                               YEAR(b.DateOfServiceLast),
                               MONTH(b.DateOfServiceLast)
                          )        AS 'Row'
FROM
        MO_CMTExtract.dbo.ProfessionalClaim            a
    LEFT JOIN
        MO_CMTExtract.dbo.ProfessionalClaimDetail      b
            ON a.ProfessionalClaimID = b.ProfessionalClaimID
    LEFT JOIN
        MO_CMTExtract.dbo.ProfessionalClaimDetailMoney c
            ON b.ProfessionalClaimDetailID = c.ProfessionalClaimDetailID)

SELECT TOP 10 WITH TIES *
FROM CTE
ORDER BY ROW_NUMBER() OVER (PARTITION BY YEAR ORDER BY COST DESC)