首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >SQL SERVER:每个字段前10行-如果少于10行,则显示空行。

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

Stack Overflow用户
提问于 2015-09-30 15:55:15
回答 2查看 875关注 0票数 1

我需要根据SYS_CD值选择前10个ACCT行。因此,我编写了以下查询。查询正常工作。

代码语言:javascript
运行
复制
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;

它提供了以下结果

代码语言:javascript
运行
复制
SYS_CD FIN_AAAT    CNTFIN_AAAT rowid
AAA     606000          4        1
AAA     566000          3            2
AAA     503200          1            3
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

查询结果也是正确的。

但是,对于SYS_CD,如果rowid小于10,则显示剩余行的空白行。

例:在上面的'AAA‘中,现在只有3个枝条。所以我需要显示7行空白。

‘’BBB‘有10个枝条,所以不需要空白行。'CCC’有4个枝条,所以我需要显示6个空白行。

我期望下面的输出。

代码语言:javascript
运行
复制
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 

我怎样才能达到这个期望的结果。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-09-30 16:07:10

您需要获得SYS_CD的所有值,以及1-10之间的数字表:

代码语言:javascript
运行
复制
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);

有了这个之后,您可以将LEFT JOIN返回到原来的查询,因此,您将得到丢失记录的NULL

代码语言:javascript
运行
复制
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;
票数 4
EN

Stack Overflow用户

发布于 2015-09-30 16:04:03

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

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32870601

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档