Sql 使用Group By子句时出错

Sql 使用Group By子句时出错,sql,group-by,Sql,Group By,我在执行时遇到sql server错误“文本ntext和图像数据类型无法比较或排序,除非使用is null或like” SELECT r.Shift, l.lab_title AS [Assigned Lab], u.user_name AS [L/A], CONVERT(varchar(100), t.Time) + ' To ' + CONVERT(varchar(100), h.Time) AS Timing FROM table_roaster_time_table

我在执行时遇到sql server错误“文本ntext和图像数据类型无法比较或排序,除非使用is null或like”

SELECT r.Shift, l.lab_title AS [Assigned Lab], u.user_name AS [L/A],
       CONVERT(varchar(100), t.Time) + '  To ' + CONVERT(varchar(100), h.Time) AS Timing
  FROM table_roaster_time_table AS r
       INNER JOIN table_time AS t ON r.timeId = t.timeId AND r.timeId = t.timeId
       INNER JOIN table_user AS u ON r.user_id = u.user_id
       INNER JOIN table_labs AS l ON r.lab_id = l.lab_id
       INNER JOIN table_time2 AS h ON r.timeId2 = h.timeId2
 GROUP BY r.Shift, l.lab_title, u.user_name

不知道是什么问题。我也使用了聚合函数,只是出于形式上的考虑,但它不起作用。

我猜你的
r.Shift
列是
text
ntext
类型。因此,它不能由

一种选择可能是对可疑列使用强制转换,但可能会丢失数据。例如:

SELECT        r.Shift, l.lab_title AS [Assigned Lab], u.user_name AS [L/A], CONVERT(varchar(100),     t.Time) + '  To ' + CONVERT(varchar(100), h.Time) AS Timing
FROM            table_roaster_time_table AS r INNER JOIN
                     table_time AS t ON r.timeId = t.timeId AND r.timeId = t.timeId INNER JOIN
                     table_user AS u ON r.user_id = u.user_id INNER JOIN
                     table_labs AS l ON r.lab_id = l.lab_id INNER JOIN
                     table_time2 AS h ON r.timeId2 = h.timeId2
GROUP BY CAST(r.Shift as varchar(max), l.lab_title, u.user_name
with temp as
(
    SELECT        l.lab_title AS [Assigned Lab], u.user_name AS [L/A], CONVERT(varchar(100),     t.Time) + '  To ' + CONVERT(varchar(100), h.Time) AS Timing
    FROM            table_roaster_time_table AS r INNER JOIN
                         table_time AS t ON r.timeId = t.timeId AND r.timeId = t.timeId INNER JOIN
                         table_user AS u ON r.user_id = u.user_id INNER JOIN
                         table_labs AS l ON r.lab_id = l.lab_id INNER JOIN
                         table_time2 AS h ON r.timeId2 = h.timeId2
    GROUP BY l.lab_title, u.user_name
)
SELECT   r.Shift, t.lab_title AS [Assigned Lab], t.user_name AS [L/A] --etc
 FROM            table_roaster_time_table AS r 
 INNER JOIN temp as t
on  r.id = t.id --or whatver
您还可以查看在没有
text
列的情况下查询数据,然后执行第二次查询以获取缺少的列。例如:

SELECT        r.Shift, l.lab_title AS [Assigned Lab], u.user_name AS [L/A], CONVERT(varchar(100),     t.Time) + '  To ' + CONVERT(varchar(100), h.Time) AS Timing
FROM            table_roaster_time_table AS r INNER JOIN
                     table_time AS t ON r.timeId = t.timeId AND r.timeId = t.timeId INNER JOIN
                     table_user AS u ON r.user_id = u.user_id INNER JOIN
                     table_labs AS l ON r.lab_id = l.lab_id INNER JOIN
                     table_time2 AS h ON r.timeId2 = h.timeId2
GROUP BY CAST(r.Shift as varchar(max), l.lab_title, u.user_name
with temp as
(
    SELECT        l.lab_title AS [Assigned Lab], u.user_name AS [L/A], CONVERT(varchar(100),     t.Time) + '  To ' + CONVERT(varchar(100), h.Time) AS Timing
    FROM            table_roaster_time_table AS r INNER JOIN
                         table_time AS t ON r.timeId = t.timeId AND r.timeId = t.timeId INNER JOIN
                         table_user AS u ON r.user_id = u.user_id INNER JOIN
                         table_labs AS l ON r.lab_id = l.lab_id INNER JOIN
                         table_time2 AS h ON r.timeId2 = h.timeId2
    GROUP BY l.lab_title, u.user_name
)
SELECT   r.Shift, t.lab_title AS [Assigned Lab], t.user_name AS [L/A] --etc
 FROM            table_roaster_time_table AS r 
 INNER JOIN temp as t
on  r.id = t.id --or whatver
此外,此SQL似乎没有必要:

r.timeId = t.timeId AND r.timeId = t.timeId

我是否应该更改其中使用的所有列,并将文本作为数据类型?更明确地说,假设以id结尾的变量为ints,GROUP BY子句中的一列属于您无法比较的类型之一。如果您需要,我不确定是否会更改它。一些选项可能是将其强制转换为varchar(max)或可能执行两个单独的查询,第一个分组不包括
ntext
列,第二个连接到原始查询以获得ntext列…@AbeMiessler您的第一个查询在“,”附近给出错误语法,第二个查询给出错误:“列table_time.time在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句中;我现在应该怎么做?您需要调试它。我给你一个开始的地方,这是99%的道路,但你需要采取的方式休息。这两条错误消息都解释了问题所在。