Sql server 汇总SQL表

Sql server 汇总SQL表,sql-server,tsql,Sql Server,Tsql,我有一个SQL表,看起来像这样: 表定义: 创建表TestSessions Id整数标识1,1主键不为null,TestUser varchar50不为null,Department varchar50不为null,Project varchar50不为null,TestDateTime varchar50不为null,Score varchar50不为null,Pass varchar50不为null 我想按TestUser对表进行分组,并分别计算每个TestUser的每个通过和失败值,使其看

我有一个SQL表,看起来像这样:

表定义:

创建表TestSessions Id整数标识1,1主键不为null,TestUser varchar50不为null,Department varchar50不为null,Project varchar50不为null,TestDateTime varchar50不为null,Score varchar50不为null,Pass varchar50不为null

我想按TestUser对表进行分组,并分别计算每个TestUser的每个通过和失败值,使其看起来像:

SQL命令:按TestUser从TestSessions组中选择TestUser,当[Score]=“通过”时选择SUMCASE,然后选择1 ELSE 0结束[Pass],当[Score]=“失败”时选择SUMCASE,然后选择1 ELSE 0结束[Fail]

返回:

我怎样才能解决这个问题

然后我想计算通过和失败之间的比率


在一个语句中是否可以实现这一点?

您需要一个简单的聚合和大小写表达式:

SELECT  Color,
        SUM(CASE WHEN [BOOL] = 'TRUE' THEN 1 ELSE 0 END) [True],
        SUM(CASE WHEN [BOOL] = 'FALSE' THEN 1 ELSE 0 END) [False]
FROM dbo.YourTable
GROUP BY Color;
这假设BOOL的数据类型是varchar,如果是bit,则需要执行以下操作:

SELECT  Color,
        SUM(CASE WHEN [BOOL] = 1 THEN 1 ELSE 0 END) [True],
        SUM(CASE WHEN [BOOL] = 0 THEN 1 ELSE 0 END) [False]
FROM dbo.YourTable
GROUP BY Color;

首先,您的案例应该检查[Score]列而不是[Score],因为[Score]从不包含通过或失败。其次,您可以尝试围绕它编写一个cte,如下所示:

WITH cte AS (
  SELECT TestUser
        ,Department
        ,CASE WHEN [Pass] = 'Pass' THEN 1 ELSE 0 END [Passed]
        ,CASE WHEN[Pass] = 'Fail' THEN 1 ELSE 0 END [Failed]
  FROM TestSessions
)
SELECT TestUser
      ,Department
      ,sum([Passed]) [Pass]
      ,sum([Failed]) [Fail]
  FROM cte
  GROUP BY TestUser, Department

我得到的回报是零。应该有总数。请像对待字符串varchar一样对待true和false。@LadislavBiskupec正如我在回答中所说的,这取决于BOOL列的数据类型。第一个代码将它们视为varchar,第二个代码视为bitTtry,将cte作为selecttestuser,CASE…END作为Pass,…,在其周围放置一个cte。。。。根据这个查询,计算例子中提到的和。据我记忆所及,SQL Server在计算案例结果时表现有点糟糕。对不起,我指的是cte和SUMTSIDE中的案例。。。如下所示:将cte设置为SELECT TestUser,Department,CASE WHEN[Pass]=“Pass”然后1 ELSE 0 END[Passed],CASE WHEN[Pass]=“Fail”然后1 ELSE 0 END[Failed]从TestSessions中选择TestUser,Department,sum[Passed][Pass],sum[Failed][Fail]从cte组中按TestUser,Department复制我的完整查询吗?我改变了你的专栏;你检查了列分数,但你应该检查列通过,因为从来没有通过或不通过的分数