将多个数据行合并为一个

时间:2017-03-28 15:03:11

标签: sql sql-server-2008-r2

我有一张如下表格

CREATE TABLE #T(Name varchar(10),Online BIT, Offline BIT,F_Id INT)

INSERT INTO #T
VALUES('A',1,0,0),('A',0,1,100),('A',1,0,200),('B',0,1,100),('B',1,0,140),  ('C',1,0,0)

我想要的是使用Name和F_Id的组合生成唯一行,但F_Id为零时除外。

基本上我所追求的输出是

A 1 1 100  --> Merging ('A',1,0,0),('A',0,1,100)
A 1 0 200
B 0 1 100
B 1 0 140
C 1 0 0

从下面开始

SELECT Name,MAX(CONVERT(INT,Online)),MAX(CONVERT(INT,Offline)),MAX(F_Id) F_Id
FROM #T
GROUP BY Name

3 个答案:

答案 0 :(得分:0)

如果我没有遗漏任何东西,你只是错过了一个where子句,这也保留了A|1|0|200

SELECT Name,
MAX(CONVERT(INT,Online)),
MAX(CONVERT(INT,Offline)),
MAX(F_Id) F_Id
FROM #T
where f_id<>0
GROUP BY Name,F_Id

答案 1 :(得分:0)

您需要按名称n fid进行分组才能获得唯一的结果

SELECT Name,MAX(CONVERT(INT,Online)),MAX(CONVERT(INT,Offline)), F_Id
FROM #T where f_id<>0
GROUP BY Name,f_id

答案 2 :(得分:0)

您应该确保只选择不同的Name和F_Id对。

CREATE TABLE #T(Name varchar(10),Online BIT, Offline BIT,F_Id INT)

INSERT INTO #T
VALUES('A',1,0,0),('A',0,1,100),('A',1,0,200),('B',0,1,100),('B',1,0,140),('C',1,0,0)
GO
6 rows affected
SELECT #T.Name, CONVERT(INT,#T.Online) OnLine, CONVERT(INT,#T.Offline) OffLine, #T.F_Id
FROM   #T
INNER JOIN (SELECT   Name, COUNT(*) AS Num
            FROM     #T
            GROUP BY Name) U
ON     U.Name = #T.Name
WHERE  #T.F_id <> 0
OR     U.Num = 1;
GO
Name | OnLine | OffLine | F_Id
:--- | -----: | ------: | ---:
A    |      0 |       1 |  100
A    |      1 |       0 |  200
B    |      0 |       1 |  100
B    |      1 |       0 |  140
C    |      1 |       0 |    0

dbfiddle here