2017-12-21 27 views
0

아래SQL Server에서 열을 현명하고 행별로 합하는 방법은 무엇입니까?

enter image description here

내가 무엇을 찾고 제발 봐 것은 행과 열 수준

에서 모두 발생해야입니다

enter image description here

입니다

내 시도

declare @t table(aggrementid varchar(20), bom_pos int, bucket int null, paymentstatus varchar(50)) 

insert into @t 
    select '1', 3000, null, null 
    union all 
    select '2', 3000, 0, 'Non-Delinquient' 
    union all 
    select '3', 4000, 0, 'Non-Delinquient' 
    union all 
    select '4', 5000, 0, 'Non-Delinquient' 
    union all 
    select '5', 7000, 0, 'NPA' 
    union all 
    select '6', 8000, 1, 'NPA' 

Select 
    bucket, 
    [Non-Delinquient], [NPA], [RollBack], [RollForward], 
    [Stabilized], [Normalized], [PaymentStatusY], 
    Total = iif([Non-Delinquient] is null, 0, [Non-Delinquient]) + 
     iif([NPA] is null, 0, [NPA]) + 
     iif([RollBack] is null, 0, [RollBack]) + 
     iif([RollForward] is null, 0, [RollForward]) + 
     iif([Stabilized] is null, 0, [Stabilized]) + 
     iif([Normalized] is null, 0, [Normalized]) + 
     iif([PaymentStatusY] is null, 0, [PaymentStatusY]) 
From 
    (Select 
     --aggrementid, 
     bom_pos, 
     bucket, paymentstatus  
    From 
     @t) as PivotSource 
PIVOT 
    (sum(bom_pos) FOR paymentstatus IN ([Non-Delinquient], [NPA],[RollBack],[RollForward],[Stabilized],[Normalized],[PaymentStatusY]) 
    ) as Pvt 
Where 
    bucket is not null 

이 이 결과를 반환합니다

enter image description here

날 계속 도와주세요. 또한, 같은 롤업 기능을 사용하여 달성 될 수있는 경우 등

답변

1

난 당신이 어떻게 작동하는지 이해하기위한도 GROUPING SETS

declare @t table(aggrementid varchar(20), bom_pos int, bucket int null, paymentstatus varchar(50)) 

insert into @t 
    select '1', 3000, null, null 
    union all 
    select '2', 3000, 0, 'Non-Delinquient' 
    union all 
    select '3', 4000, 0, 'Non-Delinquient' 
    union all 
    select '4', 5000, 0, 'Non-Delinquient' 
    union all 
    select '5', 7000, 0, 'NPA' 
    union all 
    select '6', 8000, 1, 'NPA' 

Select 
    isnull(CAST(bucket AS varchar(10)),'Total') bucket, 
    SUM([Non-Delinquient]) [Non-Delinquient], 
    SUM([NPA]) [NPA], 
    SUM([RollBack]) [RollBack], 
    SUM([RollForward]) [RollForward], 
    SUM([Stabilized]) [Stabilized], 
    SUM([Normalized]) [Normalized], 
    SUM([PaymentStatusY]) [PaymentStatusY], 
    SUM(isnull([Non-Delinquient],0) + isnull([NPA],0) + isnull([RollBack],0) + isnull([RollForward],0) + isnull([Stabilized],0) + isnull([Normalized],0) + isnull([PaymentStatusY],0)) Total 
From 
    (Select 
     --aggrementid, 
     bom_pos, 
     bucket, paymentstatus  
    From 
     @t) as PivotSource 
PIVOT 
    (sum(bom_pos) FOR paymentstatus IN ([Non-Delinquient], [NPA],[RollBack],[RollForward],[Stabilized],[Normalized],[PaymentStatusY]) 
    ) as Pvt 
Where 
    bucket is not null 
GROUP BY GROUPING SETS(
         (bucket), 
         () 
        ) 

참조 다음 예와 GROUP BY을 사용할 수 있다고 생각

SELECT 
    CASE GROUPING_ID(GroupID,SubgroupID) 
    WHEN 3 THEN 'Total' 
    WHEN 1 THEN 'Subtotal by Group' 
    WHEN 0 THEN '' 
    END RowTitle, 

    GroupID, 
    SubgroupID, 
    SUM(Value) Value 
FROM 
    (
    SELECT 1 GroupID,1 SubgroupID,10 Value 
    UNION ALL SELECT 1 GroupID,2 SubgroupID,5 Value 
    UNION ALL SELECT 1 GroupID,3 SubgroupID,5 Value 
    UNION ALL SELECT 2 GroupID,1 SubgroupID,11 Value 
    UNION ALL SELECT 2 GroupID,2 SubgroupID,12 Value 
) q 
GROUP BY GROUPING SETS(
      (GroupID,SubgroupID), 
      (GroupID), 
      () 
     ) 

enter image description here

SUMCASE을 사용할 수도 있습니다. PIVOT. 나를 위해 더 명확하게

SELECT 
    bucket, 
    SUM(CASE WHEN paymentstatus='Non-Delinquient' THEN bom_pos END) [Non-Delinquient], 
    SUM(CASE WHEN paymentstatus='NPA' THEN bom_pos END) [NPA], 
    SUM(CASE WHEN paymentstatus='RollBack' THEN bom_pos END) [RollBack], 
    SUM(CASE WHEN paymentstatus='RollForward' THEN bom_pos END) [RollForward], 
    SUM(CASE WHEN paymentstatus='Stabilized' THEN bom_pos END) [Stabilized], 
    SUM(CASE WHEN paymentstatus='Normalized' THEN bom_pos END) [Normalized], 
    SUM(CASE WHEN paymentstatus='PaymentStatusY' THEN bom_pos END) [PaymentStatusY], 
    SUM(bom_pos) Total 
FROM @t 
WHERE paymentstatus IN('Non-Delinquient', 'NPA','RollBack','RollForward','Stabilized','Normalized','PaymentStatusY') 
GROUP BY GROUPING SETS(
         (bucket), 
         () 
        ) 
1
declare @t table(aggrementid varchar(20), bom_pos int, bucket nvarchar(max) null, paymentstatus varchar(50)) 

insert into @t 
    select '1', 3000, null, null 
    union all 
    select '2', 3000, 0, 'Non-Delinquient' 
    union all 
    select '3', 4000, 0, 'Non-Delinquient' 
    union all 
    select '4', 5000, 0, 'Non-Delinquient' 
    union all 
    select '5', 7000, 0, 'NPA' 
    union all 
    select '6', 8000, 1, 'NPA' 



Select 
    bucket, 
    [Non-Delinquient], [NPA], [RollBack], [RollForward], 
    [Stabilized], [Normalized], [PaymentStatusY], 
    Total = isnull([Non-Delinquient],0) + 
      isnull([NPA],0) + 
      isnull([RollBack],0) + 
      isnull([RollForward],0) + 
      isnull([Stabilized],0) + 
      isnull([Normalized],0) + 
      isnull([PaymentStatusY],0) 
From 
    (Select 
     --aggrementid, 
     bom_pos, 
     bucket, paymentstatus  
    From 
     @t) as PivotSource 
PIVOT 
    (sum(bom_pos) FOR paymentstatus IN ([Non-Delinquient], [NPA],[RollBack],[RollForward],[Stabilized],[Normalized],[PaymentStatusY]) 
    ) as Pvt 
Where 
    bucket is not null 

    union all 

    Select 
    'Total', 
    sum([Non-Delinquient]), sum([NPA]), sum([RollBack]), sum([RollForward]), 
    sum([Stabilized]), sum([Normalized]), sum([PaymentStatusY]), 
    Total = (isnull(sum([Non-Delinquient]),0) + 
      isnull(sum([NPA]),0) + 
      isnull(sum([RollBack]),0) + 
      isnull(sum([RollForward]),0) + 
      isnull(sum([Stabilized]),0) + 
      isnull(sum([Normalized]),0) + 
      isnull(sum([PaymentStatusY]),0)) 
From 
    (Select 
     --aggrementid, 
     bom_pos, 
     bucket, paymentstatus  
    From 
     @t) as PivotSource 
PIVOT 
    (sum(bom_pos) FOR paymentstatus IN ([Non-Delinquient], [NPA],[RollBack],[RollForward],[Stabilized],[Normalized],[PaymentStatusY]) 
    ) as Pvt 
Where 
    bucket is not null