SQL SERVER:每个字段前10行-如果少于10行,则显示空行

SQL SERVER:每个字段前10行-如果少于10行,则显示空行,sql,sql-server,Sql,Sql Server,我需要根据系统CD值选择前10个科目行。因此我写了下面的查询。查询工作正常 SELECT SYS_CD, ACCT, CNTACCT ,rowid FROM ( SELECT SYS_CD, ACCT, COUNT(ACCT) AS CNTACCT, ROW_NUMBER() OVER (PARTITION BY SYS_CD ORDER BY COUNT(ACCT) DESC

我需要根据系统CD值选择前10个科目行。因此我写了下面的查询。查询工作正常

SELECT SYS_CD, ACCT, CNTACCT ,rowid
FROM
  ( SELECT SYS_CD, ACCT, COUNT(ACCT) AS CNTACCT,
           ROW_NUMBER() OVER (PARTITION BY SYS_CD
                              ORDER BY COUNT(ACCT) DESC
                             )
             AS rowid
    FROM [FCIDIAL].[dbo].table1
    WHERE ERR_CD != 'Y'

     GROUP BY SYS_CD, ACCT
  ) tmp
WHERE rowid <= 10
ORDER BY SYS_CD, rowid, ACCT;
查询结果也正确

但我的预期输出是,对于SYS_CD,如果rowid小于10,则为其余行显示空白行

示例:在上面的“AAA”中,只有3个rowid。所以我需要显示7个空行。
“BBB”与10个Rowid一起出现。因此不需要空白行。 “CCC”有4个rowid,因此我需要显示6个空行

我期望以下输出

SYS_CD ACCT        CNTACCT        rowid
AAA     606000          4        1
AAA     566000          3            2
AAA     503200          1            3
                    - Blank Row 
                    - Blank Row 
                    - Blank Row 
                    - Blank Row 
                    - Blank Row 
                    - Blank Row 
                    - Blank Row 
                    - Blank Row 
BBB     251260      42433978         1
BBB     400601      41181797         2
BBB     400401      8399908          3
BBB     503200      2087703          4
BBB     604000      40795        5
BBB     130039      4748             6
BBB     252000      655              7
BBB     736000      40               8
BBB     735000      38               9
BBB     734000      36               10
CCC     233210      73611         1
CCC     464250      39397             2
CCC     186020      35231             3
CCC     265155      4949              4
                    - Blank Row 
                    - Blank Row 
                    - Blank Row 
                    - Blank Row 
                    - Blank Row 
                    - Blank Row 
                    - Blank Row 
                    - Blank Row 

如何达到预期效果。

如果您没有现有的理货表,您可以很容易地动态生成一个理货表。假设您在2008+上,这应该可以工作

with MyData as
(
    SELECT SYS_CD
        , ACCT
        , COUNT(ACCT) AS CNTACCT
        , ROW_NUMBER() OVER (PARTITION BY SYS_CD ORDER BY COUNT(ACCT) DESC) AS rowid
    FROM [FCIDIAL].[dbo].table1
    WHERE ERR_CD != 'Y'
    GROUP BY SYS_CD
        , ACCT
)

select *
from (Values(1),(2), (3), (4), (5), (6), (7), (8), (9), (10)) n(x)
left join MyData d on d.rowid = n.x
order by d.SYS_CD, n.x

如果你没有一个现有的理货表,你可以很容易地生成一个。假设您在2008+上,这应该可以工作

with MyData as
(
    SELECT SYS_CD
        , ACCT
        , COUNT(ACCT) AS CNTACCT
        , ROW_NUMBER() OVER (PARTITION BY SYS_CD ORDER BY COUNT(ACCT) DESC) AS rowid
    FROM [FCIDIAL].[dbo].table1
    WHERE ERR_CD != 'Y'
    GROUP BY SYS_CD
        , ACCT
)

select *
from (Values(1),(2), (3), (4), (5), (6), (7), (8), (9), (10)) n(x)
left join MyData d on d.rowid = n.x
order by d.SYS_CD, n.x

您需要获取
SYS\u CD
的所有值,以及1-10之间的数字表:

SELECT  ccd.SYS_CD, n.RowID
FROM    (SELECT DISTINCT SYS_CD FROM [FCIDIAL].[dbo].table1 WHERE ERR_CD != 'Y') AS ccd
        CROSS JOIN (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) AS n (RowID);
一旦你有了这个功能,你就可以
左键连接
回到你原来的查询,这样你就可以得到
NULL
来查找丢失的记录:

WITH tmp AS
(   SELECT  SYS_CD, 
            ACCT, 
            COUNT(ACCT) AS CNTACCT,
            ROW_NUMBER() OVER (PARTITION BY SYS_CD ORDER BY COUNT(ACCT) DESC) AS rowid
    FROM    [FCIDIAL].[dbo].table1
    WHERE   ERR_CD != 'Y'
    GROUP BY SYS_CD, ACCT
) 
SELECT  ccd.SYS_CD, tmp.ACCT, tmp.CNTACCT, n.RowID
FROM    (SELECT DISTINCT SYS_CD FROM [FCIDIAL].[dbo].table1 WHERE ERR_CD != 'Y') AS ccd
        CROSS JOIN (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) AS n (RowID)
        LEFT JOIN tmp
            ON tmp.SYS_CD = ccd.SYS_CD
            AND tmp.rowid = n.RowID
ORDER BY ccd.Sys_CD, n.RowID;

您需要获取
SYS\u CD
的所有值,以及1-10之间的数字表:

SELECT  ccd.SYS_CD, n.RowID
FROM    (SELECT DISTINCT SYS_CD FROM [FCIDIAL].[dbo].table1 WHERE ERR_CD != 'Y') AS ccd
        CROSS JOIN (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) AS n (RowID);
一旦你有了这个功能,你就可以
左键连接
回到你原来的查询,这样你就可以得到
NULL
来查找丢失的记录:

WITH tmp AS
(   SELECT  SYS_CD, 
            ACCT, 
            COUNT(ACCT) AS CNTACCT,
            ROW_NUMBER() OVER (PARTITION BY SYS_CD ORDER BY COUNT(ACCT) DESC) AS rowid
    FROM    [FCIDIAL].[dbo].table1
    WHERE   ERR_CD != 'Y'
    GROUP BY SYS_CD, ACCT
) 
SELECT  ccd.SYS_CD, tmp.ACCT, tmp.CNTACCT, n.RowID
FROM    (SELECT DISTINCT SYS_CD FROM [FCIDIAL].[dbo].table1 WHERE ERR_CD != 'Y') AS ccd
        CROSS JOIN (VALUES(1),(2),(3),(4),(5),(6),(7),(8),(9),(10)) AS n (RowID)
        LEFT JOIN tmp
            ON tmp.SYS_CD = ccd.SYS_CD
            AND tmp.rowid = n.RowID
ORDER BY ccd.Sys_CD, n.RowID;

你需要使用一个数字或理货表。实际上,查询的基础需要是一个包含10行的表,然后左键连接到其余结果。目标报告系统/应用程序是什么?这比sql更容易实现,但如果您想要一个纯sql的解决方案,Sean是对的。您需要使用数字或计数表来实现这一点。实际上,查询的基础需要是一个包含10行的表,然后左键连接到其余结果。目标报告系统/应用程序是什么?在那里做起来比sql更容易,但是,如果您想要一个纯SQL的解决方案,Sean是对的。现在我发布了这个解决方案,它将获得正确的行,但是您将无法对其进行正确排序,因为对于没有全部10的每一行,d.SYS\u CD的值都将为NULL。现在我发布了这个解决方案,它将获得正确的行,但是您将无法对其进行正确排序,因为d、 SYS_CD对于没有全部10的每一行都将为空。