我需要根据SYS_CD值选择前10个ACCT行。因此,我编写了以下查询。查询正常工作。
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 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个空白行。
我期望下面的输出。
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 我怎样才能达到这个期望的结果。
发布于 2015-09-30 16:07:10
您需要获得SYS_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);有了这个之后,您可以将LEFT JOIN返回到原来的查询,因此,您将得到丢失记录的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;发布于 2015-09-30 16:04:03
如果您没有现有的理货表,您可以很容易地为这个动态生成一个表。假设您在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.xhttps://stackoverflow.com/questions/32870601
复制相似问题