union all로 소계합계를 구했는데 따로나와있습니다..ㅠ 0 8 591

by 지메이비 mssql [2022.05.12 17:51:00]



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 ' 

이런식으로 짜서 사진처럼 소계총계가 앞으로 튀어나오더라구요

소계는 안쪽으로넣고 총계는 맨밑으로빼고싶은데 방법이 있을까요??

 

 

by 마농 [2022.05.12 20:44:38]
-- ROLLUP 을 이용하면 UNION 없이 한번에 됩니다.
 GROUP BY ROLLUP( (b.dealerCode, b.largeCode)
                , (b.materialCode, b.materialName, b.dimension, b.unitCode, b.cmsMaterialCode, a.isbuyingVat)
                )
;

 


by 지메이비 [2022.05.13 10:14:38]

감사합니다!


by 지메이비 [2022.05.13 10:20:46]

알려주신대로 소계합계를 구했습니다.

근데 행을 스칼라함수로 구해서 DBO.UF_LARGENAME(b.dealercode,b.largeCode) 이런식으로 largename을 구하는데

grouping 에는 저 함수가 들어갈순없는건가요?

결과는 

                 양곡/곡분가공품               1000401    E01NEW0000401
                 양곡/곡분가공품(소계)        NULL    
                 냉동식품/즉석식품             1004078    E010000001552
                 냉동식품/즉석식품(소계)     1004079    E010000001553
                 냉동식품/즉석식품             NULL    
                 NULL(총계)                      NULL    

행을 다 이렇게 바꾸고싶어서 Grouping을 쓰려고하는데 스칼라함수라 그런지 

GROUPING 함수의 인수 1이(가) GROUP BY 절의 어떤 식과도 일치하지 않습니다. 이렇게뜹니다


by 마농 [2022.05.13 10:28:55]
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)
                )
;

 


by 지메이비 [2022.05.13 10:51:55]

아 죄송합니다 문자열합치기가 아니라 소계, 총계로 바꾸고싶다는 의미였습니다.. 죄송합니다


by 마농 [2022.05.13 11:03:52]

뭔말인지 모르겟네요.
제가 드린 답변이 참고 및 도움이 될 것 같은데? 아닌가요?
답변 참고하여 응용하시면 될 것 같습니다.
잘 안되시면 다시 질문해 주세요, 정확한 표현과 예시로.


by 지메이비 [2022.05.13 11:18:01]

 

 

양곡/곡분가공품               1000401    E01NEW0000401
(소계)                              NULL    
냉동식품/즉석식품             1004078    E010000001552
냉동식품/즉석식품              1004079    E010000001553

(소계)                              NULL    
(총계)                              NULL    

 

이렇게 결과가 나오면 좋겠습니다.


by 마농 [2022.05.13 11:31:08]

조금만 응용하시면 되는데...
다만, 이렇게 표현하면 소계가 보기 어려울 수도 있습니다.(개인적인 생각)
저는 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)
                )
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입