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' 的用户将永远不会被列出,即使没有其他用户做得更好。