2017-03-28 119 views
1

我有一个像下面合并多个数据行到一个

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) 

我要的是生成使用名称和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 
+2

那么A | 1 | 0 | 200排呢? – scsimon

+0

为什么'A 1 1 100'? – McNets

+0

@scsimon:对不起,错过了,现在已经更新 –

回答

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 
+0

我需要得到该行'一个 100' –

0

您需要按名称进行分组n以获得唯一的结果结束

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

您应该确保只选择不同的名称对和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

+0

我需要的行'A 1个1 100' –

+0

所有(名称,F_ID)与其他组合的领域?因为没有一行'A 1 1 100' – McNets

+0

我又增加了一行C值并更新了预期结果 –