2016-09-18 77 views
1

對不起,我沒有拿出一個好問題的標題,所以隨意相應地改變它。在一列中聚合不同的行SQL查詢

我可以描述我的問題在MS SQL Server 2012的一個小例子:

create table #tmp 
(
    RowID varchar(10), 
    SectionCode int, 
    SectionName varchar(10) 
) 

insert into #tmp values('Record1' , 1 , 'AB'); 
insert into #tmp values('Record1' , 2 , 'CD'); 
insert into #tmp values('Record1' , 3 , 'EF'); 
insert into #tmp values('Record2' , 1 , 'AB'); 
insert into #tmp values('Record2' , 4 , 'GH'); 
insert into #tmp values('Record2' , 5 , 'IJ'); 
insert into #tmp values('Record3' , 2 , 'CD'); 
insert into #tmp values('Record3' , 5 , 'IJ'); 

我想創建每個記錄結果的一排,其中每個部分是一列,如果有一個排與一個部分相關聯,相應的列值增加。這是(不)我想要的東西(在不同的行相同的記錄數據)

select RowID, 
    case when SectionName = 'AB' then 1 else 0 end as [AB Section] , 
    case when SectionName = 'CD' then 1 else 0 end as [CD Section] , 
    case when SectionName = 'EF' then 1 else 0 end as [EF Section] , 
    case when SectionName = 'GH' then 1 else 0 end as [GH Section] , 
    case when SectionName = 'IJ' then 1 else 0 end as [IJ Section] 
           from #tmp 
group by RowID , SectionName 

這給出了這樣的輸出:

Wrong Output Result

我需要這樣的:

Correct Output

在此先感謝

+0

正如@bill提到的,對於RECORD2 IJ的值是1。感謝。 –

回答

1

我想你想要這個:

select RowID, 
     sum(case when SectionName = 'AB' then 1 else 0 end) as [AB Section] , 
     sum(case when SectionName = 'CD' then 1 else 0 end) as [CD Section] , 
     sum(case when SectionName = 'EF' then 1 else 0 end) as [EF Section] , 
     sum(case when SectionName = 'GH' then 1 else 0 end) as [GH Section] , 
from #tmp 
group by RowID; 

也就是說,你需要聚合函數。 group by應包含您想要定義每一行的列(即只包含RowId)。

+0

「對應列值增加」暗示'sum(.. 1.0)'我猜。 – Serg

+0

@Serg。 。 。這就說得通了。樣本數據不區分這兩種情況。 –

2

您可以像下面一樣使用pivot來操作不同部分的值。

SELECT rowid 
,CASE 
    WHEN ab IS NULL 
     THEN 0 
    ELSE 1 
    END AS ab 
,CASE 
    WHEN cd IS NULL 
     THEN 0 
    ELSE 1 
    END AS cd 
,CASE 
    WHEN ef IS NULL 
     THEN 0 
    ELSE 1 
    END AS ef 
,CASE 
    WHEN gh IS NULL 
     THEN 0 
    ELSE 1 
    END AS gh 
,CASE 
    WHEN ij IS NULL 
     THEN 0 
    ELSE 1 
    END AS ij 
FROM (
SELECT * 
FROM #tmp 
PIVOT(MAX(Sectioncode) FOR Sectionname IN (
      AB 
      ,CD 
      ,EF 
      ,GH 
      ,IJ 
      )) pvt 
) tab 

我想你顯示的結果是不備案編號是否正確2.記錄ID 2的IJ應爲1

+0

謝謝,您的解決方案是否更好的性能?這對我來說似乎更加複雜。 –