2017-03-28 159 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值並更新了預期結果 –