SQL获取分组元素中每列中第一个出现的值

SQL获取分组元素中每列中第一个出现的值,sql,sql-server,tsql,reporting-services,Sql,Sql Server,Tsql,Reporting Services,我正在使用SQL Server和Reporting Services构建报告。我有一个类似以下内容的数据集,其中所有列都是VARCHAR类型: 我有一份报告应该有这样的输出: Line Code Col1 Col2 Col3 Col4 ============================================ 1 xxx 1.1 2.3 8.7 3.4 2 yyy 5.3 !err

我正在使用SQL Server和Reporting Services构建报告。我有一个类似以下内容的数据集,其中所有列都是VARCHAR类型:

我有一份报告应该有这样的输出:

Line    Code    Col1    Col2    Col3    Col4
============================================
1       xxx     1.1     2.3     8.7     3.4
2       yyy     5.3     !err    6.5     9.1
因此,我基本上需要对Line列执行分组,包括组中每个列的第一个非空值

如果列是数字类型,我可以使用SUM来获得所需的结果,但是由于我处理的是VARCHAR,所以我不能使用SUM。我也不能将VARCHAR转换为数值,因为如果我的值是非数值,如建议的!在我的示例中出错,则不会显示它


我可以使用什么查询来获得所需的结果?

由于给定行/代码只能有一个col-n值,这将适用于您:

select
    line,
    code,
    max(col1) col1,
    max(col2) col2,
    max(col3) col3,
    max(col4) col4
from mytable
group by line, code
这对我很有用:

declare @t table (line int, code varchar(4), c1 varchar(5), c2 varchar(5), c3 varchar(5), c4 varchar(5))

insert into @t (line, code, c1, c2, c3, c4) values (1, 'xxx', '1.5', '', '', '')
insert into @t (line, code, c1, c2, c3, c4) values  (1, 'xxx', '', 'err!', '', '')
insert into @t (line, code, c1, c2, c3, c4) values  (1, 'xxx', '', '', '2.3', '')
insert into @t (line, code, c1, c2, c3, c4) values  (1, 'xxx', '', '', '', '3.5')

insert into @t (line, code, c1, c2, c3, c4) values (2, 'yyy', '1.2', '', '', '')
insert into @t (line, code, c1, c2, c3, c4) values  (2, 'yyy', '', '0.8', '', '')
insert into @t (line, code, c1, c2, c3, c4) values  (2, 'yyy', '', '', 'err!', '')
insert into @t (line, code, c1, c2, c3, c4) values  (2, 'yyy', '', '', '', '4.6')

/* IF only one value in each column for a given code */
SELECT M1.Line, M1.Code 
, (SELECT c1 as cc FROM @t WHERE code = M1.code AND c1 <> '') as c1
, (SELECT c2 as cc FROM @t WHERE code = M1.code AND c2 <> '') as c2
, (SELECT c3 as cc FROM @t WHERE code = M1.code AND c3 <> '') as c3
, (SELECT c4 as cc FROM @t WHERE code = M1.code AND c4 <> '') as c4
FROM @t M1
GROUP BY M1.Line, M1.Code

虽然您的示例数据没有显示它,但是对于给定的行和coln是否可以有多个值?一个给定的行可以有多个代码吗?不,对于每个行值,每列中只会出现一个非空值。而且每行值也不会有多个代码值。这不会给出期望的结果,您需要删除“代码”列上的聚合,并将其包含在“分组依据:分组依据行,代码”中。@dimt我明白您的意思了。你可能是对的,我会做出改变
declare @t table (line int, code varchar(4), c1 varchar(5), c2 varchar(5), c3 varchar(5), c4 varchar(5))

insert into @t (line, code, c1, c2, c3, c4) values (1, 'xxx', '1.5', '', '', '')
insert into @t (line, code, c1, c2, c3, c4) values  (1, 'xxx', '', 'err!', '', '')
insert into @t (line, code, c1, c2, c3, c4) values  (1, 'xxx', '', '', '2.3', '')
insert into @t (line, code, c1, c2, c3, c4) values  (1, 'xxx', '', '', '', '3.5')

insert into @t (line, code, c1, c2, c3, c4) values (2, 'yyy', '1.2', '', '', '')
insert into @t (line, code, c1, c2, c3, c4) values  (2, 'yyy', '', '0.8', '', '')
insert into @t (line, code, c1, c2, c3, c4) values  (2, 'yyy', '', '', 'err!', '')
insert into @t (line, code, c1, c2, c3, c4) values  (2, 'yyy', '', '', '', '4.6')

/* IF only one value in each column for a given code */
SELECT M1.Line, M1.Code 
, (SELECT c1 as cc FROM @t WHERE code = M1.code AND c1 <> '') as c1
, (SELECT c2 as cc FROM @t WHERE code = M1.code AND c2 <> '') as c2
, (SELECT c3 as cc FROM @t WHERE code = M1.code AND c3 <> '') as c3
, (SELECT c4 as cc FROM @t WHERE code = M1.code AND c4 <> '') as c4
FROM @t M1
GROUP BY M1.Line, M1.Code