SET @qry=@qry+char(13)+ ' select largeName,materialCode,cmsMaterialCode,materialName,dimension,unitName,qty,price,buyingTotal,buyingAmt,buyingVat,isBuyingVat,largeCode from(select DBO.UF_LARGENAME(b.dealercode,b.largeCode) as largeName, b.materialCode, b.materialName, b.dimension , DBO.UF_UNITNAME(b.unitCode) as unitName , SUM(a.materialQty-a.rtnQty) as qty, (case when a.isBuyingVat=''Y'' then dbo.UF_MCVT2(round(SUM(a.buyingAmt)/(case when SUM(a.materialQty-a.rtnQty)=0 then 1 else SUM(a.materialQty-a.rtnQty) end),0),0,0) else dbo.UF_MCVT2(round(SUM(a.buyingAmt+a.buyingVat)/(case when SUM(a.materialQty-a.rtnQty) = 0 then 1 else SUM(a.materialQty-a.rtnQty) end),0),0,0) end ) as price, SUM(a.buyingAmt + a.buyingVat) as buyingTotal, SUM(a.buyingAmt) as buyingAmt, SUM(a.buyingVat) as buyingVat, isNull(b.cmsMaterialCode,'''') as cmsMaterialCode, a.isBuyingVat, b.largeCode from orders a,material b where a.dealerCode='''+@A_dealerCode+''' and a.stockinDay between '''+@A_startDay+''' and '''+@A_endDay+''' ' '''''' SET @qry=@qry+char(13)+ ' group by b.dealerCode,b.largeCode,b.materialCode,b.materialName,b.dimension,b.unitCode,b.cmsMaterialCode,a.isbuyingVat ' set @qry = @qry +' union all ' set @qry = @qry +' select ''소계'','''','''','''','''',SUM(a.materialQty-a.rtnQty) as qty,0 ' set @qry = @qry +' ,SUM(a.buyingAmt + a.buyingVat) as buyingTotal, SUM(a.buyingAmt) as buyingAmt, ' set @qry = @qry +' SUM(a.buyingVat) as buyingVat,'''','''' ,'''' from orders a,material b where a.dealerCode='''+@A_dealerCode+''' and a.stockinDay between '''+@A_startDay+''' and '''+@A_endDay+''' ' '''''' SET @qry=@qry+char(13)+ ' group by DBO.UF_LARGENAME(b.dealercode,b.largeCode) ' set @qry = @qry +' union all ' set @qry = @qry +' select ''총계'','''','''','''','''',SUM(a.materialQty-a.rtnQty) as qty,0 ' set @qry = @qry +' ,SUM(a.buyingAmt + a.buyingVat) as buyingTotal, SUM(a.buyingAmt) as buyingAmt, ' set @qry = @qry +' SUM(a.buyingVat) as buyingVat,'''','''','''' from orders a,material b ' set @qry = @qry +' where a.dealerCode='''+@A_dealerCode+''' ' set @qry = @qry +' and a.stockinDay between '''+@A_startDay+''' and '''+@A_endDay+''' )f ' set @qry = @qry +' order by f.materialName ' 이런식으로 짜서 사진처럼 소계총계가 앞으로 튀어나오더라구요
소계는 안쪽으로넣고 총계는 맨밑으로빼고싶은데 방법이 있을까요??
알려주신대로 소계합계를 구했습니다.
근데 행을 스칼라함수로 구해서 DBO.UF_LARGENAME(b.dealercode,b.largeCode) 이런식으로 largename을 구하는데
grouping 에는 저 함수가 들어갈순없는건가요?
결과는
양곡/곡분가공품 1000401 E01NEW0000401
양곡/곡분가공품(소계) NULL
냉동식품/즉석식품 1004078 E010000001552
냉동식품/즉석식품(소계) 1004079 E010000001553
냉동식품/즉석식품 NULL
NULL(총계) NULL
행을 다 이렇게 바꾸고싶어서 Grouping을 쓰려고하는데 스칼라함수라 그런지
GROUPING 함수의 인수 1이(가) GROUP BY 절의 어떤 식과도 일치하지 않습니다. 이렇게뜹니다
SELECT CONCAT( dbo.uf_largename(b.dealercode, b.largeCode) , CASE 1 WHEN GROUPING(b.largeCode ) THEN '(총계)' WHEN GROUPING(b.materialCode) THEN '(소계)' END ) largeName , b.materialCode , b.materialName , ... FROM ... WHERE ... GROUP BY ROLLUP( (b.dealerCode, b.largeCode) , (b.materialCode, b.materialName, b.dimension, b.unitCode, b.cmsMaterialCode, a.isbuyingVat) ) ;
조금만 응용하시면 되는데...
다만, 이렇게 표현하면 소계가 보기 어려울 수도 있습니다.(개인적인 생각)
저는 b.materialName 쪽에 소계를 표현하는게 더 좋지 않을까? 생각합니다.(개인적인 생각)
SELECT CASE 1 WHEN GROUPING(b.largeCode ) THEN '(총계)' WHEN GROUPING(b.materialCode) THEN '(소계)' ELSE dbo.uf_largename(b.dealercode, b.largeCode) END largeName , b.materialCode , b.materialName , ... FROM ... WHERE ... GROUP BY ROLLUP( (b.dealerCode, b.largeCode) , (b.materialCode, b.materialName, b.dimension, b.unitCode, b.cmsMaterialCode, a.isbuyingVat) ) ;