SQL SERVER:每个字段前10行-如果少于10行,则显示空行
我需要根据系统CD值选择前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
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的每一行都将为空。