SQL 查询分类显示记录
SQL Query to display records categorically
我的查询显示输出如下所示
`UserName Status Count`
`A Pass 32`
`A fail 2`
`A Hold 4`
`B Fail 12`
`C Pass 40`
`C Fail 4`
`C Hold 3`
`D Pass 2`
我想要显示输出,首先记录用户名 C 及其详细信息,其次记录 A 及其详细信息。我正在尝试获取具有高通过状态的前 5 条记录及其相关的用户名记录。如果该用户名存在于前 5 名中,我不想保留第 6 条记录。请帮助
抱歉,我无法以表格格式进行格式化。
;WITH CTE_UserRanking AS (
SELECT
UserID,
DENSE_RANK() OVER (ORDER BY COUNT(*) DESC) AS user_rank
FROM
dbo.User_Scores S
WHERE
S.Status = 'Pass'
GROUP BY
UserID
)
SELECT
U.UserName,
S.Status,
COUNT(*)
FROM
CTE_UserRanking R
INNER JOIN dbo.Users U ON U.UserID = R.UserID
INNER JOIN dbo.Scores S ON S.UserID = R.UserID
WHERE
R.user_rank <= 5
GROUP BY
U.UserID,
U.UserName,
S.Status
ORDER BY
R.user_rank
使用分析函数获取每个用户的通过率,获得前 5 名,并按通过率排序。
select username, status, cnt
from
(
select top(5) username, status, cnt, sum(case when status = 'Pass' then cnt else 0 end)
over (partition by username) as passed
from mytable
order by 4 desc
) top5
order by
passed desc,
username,
case status when 'Pass' then 1 when 'fail' then 2 else 3 end;
(我冒昧地将您的计数列称为 cnt,因为 COUNT 是 SQL 中的保留字,最好不要选择列名。)
实现想要的listing顺序比较简单:
select top 6 * from #tbl INNER JOIN (
SELECT UserName u, cnt pc FROM #tbl WHERE Status='Pass'
) ord ON u=UserName ORDER BY pc desc,status desc
但是,将其限制为 5 行,以防第一个结果集不完整,并不是那么容易。我还在努力...
编辑:
好吧,经过几次尝试我发现,当你将输出行限制为某个最大数量时,根据数据结构,如果你坚持所有行始终完整列出用户。因此,如果我们将输出限制为 6 行,那么如果下一个用户要再提供 3 行,则列表可能会在第 4 行结束。接受后,您可以使用以下内容:
;WITH cnts AS ( SELECT
UserName un,
SUM(CASE Status
WHEN 'Pass' THEN 10000 -- weighing system
WHEN 'Hold' THEN 100 -- to sort the results ...
ELSE 1 END * cnt) scr, -- --> score for sorting
COUNT(*) ncnt -- row count per UserName
FROM #tbl GROUP BY UserName
)
SELECT UserName,Status,cnt,scr,acnt FROM #tbl INNER JOIN (
SELECT un,scr,(SELECT SUM(ncnt) FROM cnts WHERE scr>=c.scr) acnt
FROM cnts c WHERE (SELECT SUM(ncnt) FROM cnts WHERE scr>=c.scr) <=6
) srt ON UserName=un
ORDER BY scr DESC, UserName, Status desc
见here。
子查询 (SELECT SUM(ncnt) FROM cnts WHERE scr>=c.scr)
表示累积行数,我在 srt
-子查询的 where
子句中使用它来限制输出。
与我的第一种方法相反,我现在根据 scr
进行内部排序,这是我通过将所有 pass/hold/fail-counts 与不同的权重因子相加来计算的内部分数。如果不这样做,没有一个 'pass' 的用户将永远不会被列出,即使没有其他用户做得更好。
我的查询显示输出如下所示
`UserName Status Count`
`A Pass 32`
`A fail 2`
`A Hold 4`
`B Fail 12`
`C Pass 40`
`C Fail 4`
`C Hold 3`
`D Pass 2`
我想要显示输出,首先记录用户名 C 及其详细信息,其次记录 A 及其详细信息。我正在尝试获取具有高通过状态的前 5 条记录及其相关的用户名记录。如果该用户名存在于前 5 名中,我不想保留第 6 条记录。请帮助
抱歉,我无法以表格格式进行格式化。
;WITH CTE_UserRanking AS (
SELECT
UserID,
DENSE_RANK() OVER (ORDER BY COUNT(*) DESC) AS user_rank
FROM
dbo.User_Scores S
WHERE
S.Status = 'Pass'
GROUP BY
UserID
)
SELECT
U.UserName,
S.Status,
COUNT(*)
FROM
CTE_UserRanking R
INNER JOIN dbo.Users U ON U.UserID = R.UserID
INNER JOIN dbo.Scores S ON S.UserID = R.UserID
WHERE
R.user_rank <= 5
GROUP BY
U.UserID,
U.UserName,
S.Status
ORDER BY
R.user_rank
使用分析函数获取每个用户的通过率,获得前 5 名,并按通过率排序。
select username, status, cnt
from
(
select top(5) username, status, cnt, sum(case when status = 'Pass' then cnt else 0 end)
over (partition by username) as passed
from mytable
order by 4 desc
) top5
order by
passed desc,
username,
case status when 'Pass' then 1 when 'fail' then 2 else 3 end;
(我冒昧地将您的计数列称为 cnt,因为 COUNT 是 SQL 中的保留字,最好不要选择列名。)
实现想要的listing顺序比较简单:
select top 6 * from #tbl INNER JOIN (
SELECT UserName u, cnt pc FROM #tbl WHERE Status='Pass'
) ord ON u=UserName ORDER BY pc desc,status desc
但是,将其限制为 5 行,以防第一个结果集不完整,并不是那么容易。我还在努力...
编辑:
好吧,经过几次尝试我发现,当你将输出行限制为某个最大数量时,根据数据结构,如果你坚持所有行始终完整列出用户。因此,如果我们将输出限制为 6 行,那么如果下一个用户要再提供 3 行,则列表可能会在第 4 行结束。接受后,您可以使用以下内容:
;WITH cnts AS ( SELECT
UserName un,
SUM(CASE Status
WHEN 'Pass' THEN 10000 -- weighing system
WHEN 'Hold' THEN 100 -- to sort the results ...
ELSE 1 END * cnt) scr, -- --> score for sorting
COUNT(*) ncnt -- row count per UserName
FROM #tbl GROUP BY UserName
)
SELECT UserName,Status,cnt,scr,acnt FROM #tbl INNER JOIN (
SELECT un,scr,(SELECT SUM(ncnt) FROM cnts WHERE scr>=c.scr) acnt
FROM cnts c WHERE (SELECT SUM(ncnt) FROM cnts WHERE scr>=c.scr) <=6
) srt ON UserName=un
ORDER BY scr DESC, UserName, Status desc
见here。
子查询 (SELECT SUM(ncnt) FROM cnts WHERE scr>=c.scr)
表示累积行数,我在 srt
-子查询的 where
子句中使用它来限制输出。
与我的第一种方法相反,我现在根据 scr
进行内部排序,这是我通过将所有 pass/hold/fail-counts 与不同的权重因子相加来计算的内部分数。如果不这样做,没有一个 'pass' 的用户将永远不会被列出,即使没有其他用户做得更好。