sql server 2012中的计数结果

sql server 2012中的计数结果,sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我在SQL Server 2012中进行了查询,以查看我公司的用户部门 SELECT mdl_user_info_data.data FROM dbo.mdl_user, dbo.mdl_course, dbo.mdl_user_enrolments, dbo.mdl_enrol, dbo.mdl_course_categories, dbo.mdl_user_info_data WHERE mdl_course.id = md

我在SQL Server 2012中进行了查询,以查看我公司的用户部门

SELECT mdl_user_info_data.data
FROM 
    dbo.mdl_user, 
    dbo.mdl_course, 
    dbo.mdl_user_enrolments, 
    dbo.mdl_enrol, 
    dbo.mdl_course_categories,
    dbo.mdl_user_info_data
WHERE 
    mdl_course.id = mdl_enrol.courseid AND 
    mdl_enrol.id = mdl_user_enrolments.enrolid AND 
    mdl_user_enrolments.userid = mdl_user.id AND 
    mdl_course.category = mdl_course_categories.id AND 
    mdl_course.id = 3 and
    mdl_user_info_data.fieldid = 3 and
    mdl_user.id = mdl_user_info_data.userid
我的查询结果是:

|data|
|CIS|
|CIS|
|TOP|
但我想要的是这样的:

|DATA| TOTAL |
|CIS | 2 |
|TOP | 1 |
有人能帮我吗?无论如何,谢谢

我的mdl\u用户\u信息\u数据属性:

[id] [bigint] IDENTITY(1,1) NOT NULL,
[userid] [bigint] NOT NULL,
[fieldid] [bigint] NOT NULL,
[data] [ntext] NOT NULL,
[dataformat] [smallint] NOT NULL,
来自mdl\u用户信息\u数据的某些行:
id用户id字段id数据数据格式

3 CIS 0

尝试使用
分组依据
子句

SELECT mdl_user_info_data.data,count(1) as Total
FROM dbo.mdl_user, 
     dbo.mdl_course, 
     dbo.mdl_user_enrolments, 
     dbo.mdl_enrol, 
     dbo.mdl_course_categories,
     dbo.mdl_user_info_data
WHERE mdl_course.id = mdl_enrol.courseid AND 
      mdl_enrol.id = mdl_user_enrolments.enrolid AND 
      mdl_user_enrolments.userid = mdl_user.id AND 
      mdl_course.category = mdl_course_categories.id AND 
      mdl_course.id = 3 and
      mdl_user_info_data.fieldid = 3 and
      mdl_user.id = mdl_user_info_data.userid
group by 
      mdl_user_info_data.data

但请考虑下面的解决方案

SELECT muid.data,count(1) as Total
FROM dbo.mdl_user mu, 
     dbo.mdl_course mc, 
     dbo.mdl_user_enrolments mue, 
     dbo.mdl_enrol me, 
     dbo.mdl_course_categories mcc,
     dbo.mdl_user_info_data muid
WHERE mc.id = me.courseid AND 
      me.id = mue.enrolid AND 
      mue.userid = mu.id AND 
      mc.category = mcc.id AND 
      mc.id = 3 and
      muid.fieldid = 3 and
      mu.id = muid.userid
group by muid.data

在上面的示例中,我向列添加了别名。使用它们是一种很好的做法,因为代码更具可读性

尝试使用
分组依据
子句

SELECT mdl_user_info_data.data,count(1) as Total
FROM dbo.mdl_user, 
     dbo.mdl_course, 
     dbo.mdl_user_enrolments, 
     dbo.mdl_enrol, 
     dbo.mdl_course_categories,
     dbo.mdl_user_info_data
WHERE mdl_course.id = mdl_enrol.courseid AND 
      mdl_enrol.id = mdl_user_enrolments.enrolid AND 
      mdl_user_enrolments.userid = mdl_user.id AND 
      mdl_course.category = mdl_course_categories.id AND 
      mdl_course.id = 3 and
      mdl_user_info_data.fieldid = 3 and
      mdl_user.id = mdl_user_info_data.userid
group by 
      mdl_user_info_data.data

但请考虑下面的解决方案

SELECT muid.data,count(1) as Total
FROM dbo.mdl_user mu, 
     dbo.mdl_course mc, 
     dbo.mdl_user_enrolments mue, 
     dbo.mdl_enrol me, 
     dbo.mdl_course_categories mcc,
     dbo.mdl_user_info_data muid
WHERE mc.id = me.courseid AND 
      me.id = mue.enrolid AND 
      mue.userid = mu.id AND 
      mc.category = mcc.id AND 
      mc.id = 3 and
      muid.fieldid = 3 and
      mu.id = muid.userid
group by muid.data
在上面的示例中,我向列添加了别名。使用它们是一种很好的做法,因为代码更具可读性

试试这个-

SELECT id.data, COUNT(1)
FROM dbo.mdl_user u
JOIN dbo.mdl_user_enrolments ue ON ue.userid = u.id
JOIN dbo.mdl_enrol e ON e.id = ue.enrolid
JOIN dbo.mdl_course c ON c.id = e.courseid
--JOIN dbo.mdl_course_categories cc ON c.category = cc.id
JOIN dbo.mdl_user_info_data id ON u.id = id.userid
WHERE c.id = 3
     AND id.fieldid = 3
GROUP BY id.data
更新:

SELECT t.data, Total = COUNT(1) 
FROM (
     SELECT data = CAST(id.data AS NVARCHAR(MAX))
     FROM dbo.mdl_user u
     JOIN dbo.mdl_user_enrolments ue ON ue.userid = u.id
     JOIN dbo.mdl_enrol e ON e.id = ue.enrolid
     JOIN dbo.mdl_course c ON c.id = e.courseid
     --JOIN dbo.mdl_course_categories cc ON c.category = cc.id
     JOIN dbo.mdl_user_info_data id ON u.id = id.userid
     WHERE c.id = 3
          AND id.fieldid = 3
) t
GROUP BY t.data
试试这个-

SELECT id.data, COUNT(1)
FROM dbo.mdl_user u
JOIN dbo.mdl_user_enrolments ue ON ue.userid = u.id
JOIN dbo.mdl_enrol e ON e.id = ue.enrolid
JOIN dbo.mdl_course c ON c.id = e.courseid
--JOIN dbo.mdl_course_categories cc ON c.category = cc.id
JOIN dbo.mdl_user_info_data id ON u.id = id.userid
WHERE c.id = 3
     AND id.fieldid = 3
GROUP BY id.data
更新:

SELECT t.data, Total = COUNT(1) 
FROM (
     SELECT data = CAST(id.data AS NVARCHAR(MAX))
     FROM dbo.mdl_user u
     JOIN dbo.mdl_user_enrolments ue ON ue.userid = u.id
     JOIN dbo.mdl_enrol e ON e.id = ue.enrolid
     JOIN dbo.mdl_course c ON c.id = e.courseid
     --JOIN dbo.mdl_course_categories cc ON c.category = cc.id
     JOIN dbo.mdl_user_info_data id ON u.id = id.userid
     WHERE c.id = 3
          AND id.fieldid = 3
) t
GROUP BY t.data

感谢您的帮助,但它会产生如下错误:Msg 306,级别16,状态2,第17行文本、ntext和图像数据类型无法进行比较或排序,除非使用IS NULL或like运算符。在第二个代码中,它仍然会产生错误,这里是:Msg 306,级别16,状态2,第15行文本、ntext,和图像数据类型不能进行比较或排序,除非使用IS NULL或LIKE运算符。@user1533670您能描述
mdl\u user\u info\u data
表格吗?谢谢您的帮助,但它会产生如下错误:Msg 306,级别16,状态2,第17行无法比较或排序文本、ntext和图像数据类型,除非使用IS NULL或LIKE运算符。在第二个代码中,它仍然会产生错误,这里是:Msg 306,级别16,状态2,第15行文本,ntext和图像数据类型不能进行比较或排序,除非使用IS NULL或LIKE运算符。@user1533670您能描述
mdl_用户信息数据
table吗?您好,谢谢您的帮助,但是你的代码不适用于,很抱歉。这是一个错误:Msg 306,级别16,状态2,第10行文本、ntext和图像数据类型无法比较或排序,除非使用is NULL或LIKE运算符。很抱歉,但是为什么要使用
ntext
?此数据类型已弃用。尝试将数据类型更改为
NVARCHAR(MAX)
或类似的内容。我没有创建那个数据库,数据库是由moodle系统自动创建的。我最近在做一个使用CMS moodle的项目。欢迎@user1533670。另外,请阅读此主题:您好,谢谢您的帮助,但您的代码无法正常工作,对此表示抱歉。这是一个错误:Msg 306,级别16,状态2,第10行文本、ntext和图像数据类型无法比较或排序,除非使用is NULL或LIKE运算符。很抱歉,但是为什么要使用
ntext
?此数据类型已弃用。尝试将数据类型更改为
NVARCHAR(MAX)
或类似的内容。我没有创建那个数据库,数据库是由moodle系统自动创建的。我最近在做一个使用CMS moodle的项目。欢迎@user1533670。另外,请阅读本主题: