안녕하세요 소계총계 자리는 다잡았는데 정렬이 안됩니다 ㅠㅠ 0 21 1,595

by 지메이비 [SQL Query] MSSQL [2022.06.16 09:50:16]



SET @qry=@qry+char(13)+	' 	SELECT '
	SET @qry=@qry+char(13)+	' 		case when GROUPING_ID(stockInDay,materialCode)=''1'' then ''소계'' 
									     when GROUPING_ID(stockInDay,materialCode)=''3'' then ''총계''
									else stockInDay end as stockInDay,'
	SET @qry=@qry+char(13)+	'       materialCode,                                    '
	--SET @qry=@qry+char(13)+	'       materialName,                                    '
	SET @qry=@qry+char(13)+	'       case when materialName is null and materialCode is not null then ''소계'' else materialName end materialName ,                             '
	SET @qry=@qry+char(13)+	'       dimension,                             '
	SET @qry=@qry+char(13)+	'       domesticText,                             '
	SET @qry=@qry+char(13)+	'       sum(realQty) realQty,                            '
	SET @qry=@qry+char(13)+	'       unitName,                              '
	SET @qry=@qry+char(13)+	'       sellerCode,                             '
	SET @qry=@qry+char(13)+	'       sellerName,                              '
	SET @qry=@qry+char(13)+	'       storeCode,                             '
	SET @qry=@qry+char(13)+	'       storeName,                             '
	SET @qry=@qry+char(13)+	'       isSellingvat,                             '
	SET @qry=@qry+char(13)+	'       sellingPrice,                            '
	SET @qry=@qry+char(13)+	'       sum(sellingTotal) sellingTotal,                              '
	SET @qry=@qry+char(13)+	'       sum(sellingAmt) sellingAmt,                             '
	SET @qry=@qry+char(13)+	'       sum(sellingVat) sellingVat,                            '
	SET @qry=@qry+char(13)+	'       remark,                            '
	SET @qry=@qry+char(13)+	'       restrictCount,                             '
	SET @qry=@qry+char(13)+	'       modifierDate,                            '
	SET @qry=@qry+char(13)+	'       sellermaterialcode,                             '
	SET @qry=@qry+char(13)+	'       remark2,                              '
	SET @qry=@qry+char(13)+	'       handphone,                             '
	SET @qry=@qry+char(13)+	'       address                             '

	SET @qry=@qry+char(13)+	' 	FROM ('
	SET @qry=@qry+char(13)+	' 	select '
	SET @qry=@qry+char(13)+	' 		a.stockInDay, '
	SET @qry=@qry+char(13)+	' 		a.materialCode, '
	SET @qry=@qry+char(13)+	' 		b.materialName, '
	SET @qry=@qry+char(13)+	' 		b.dimension, '
	SET @qry=@qry+char(13)+	' 		b.domesticText, '
	SET @qry=@qry+char(13)+	' 		a.materialQty-a.rtnQty as realQty, '
	SET @qry=@qry+char(13)+	' 		DBO.UF_UNITNAME(b.unitCode) as unitName, '
	SET @qry=@qry+char(13)+	' 		a.sellerCode, '
	SET @qry=@qry+char(13)+	' 		DBO.UF_SELLERNAME(a.dealerCode,a.sellercode) as sellerName, '
	SET @qry=@qry+char(13)+	' 		a.storeCode, '
	SET @qry=@qry+char(13)+	' 		case when a.storecode = ''9999'' then ''창고입고'' '
 	SET @qry=@qry+char(13)+	'		else ( case when len(replace(a.storetype,'' '',''''))>0 then DBO.UF_STORENAME(a.dealerCode,a.storeCode)+''(''+replace(a.storetype,'' '','''')+'')'' else DBO.UF_STORENAME(a.dealerCode,a.storeCode) end ) end as storeName, '
	SET @qry=@qry+char(13)+	' 		a.isSellingvat, '
	SET @qry=@qry+char(13)+	' 		a.sellingPrice, '
	SET @qry=@qry+char(13)+	' 		a.sellingAmt+a.sellingVat as sellingTotal, '
	SET @qry=@qry+char(13)+	' 		a.sellingAmt, '
	SET @qry=@qry+char(13)+	' 		a.sellingVat, '
	SET @qry=@qry+char(13)+	' 		a.remark, '
	SET @qry=@qry+char(13)+	' 		(case when a.orders_restrictcount is null then ''D-''+isnull(b.restrictCount,''1'') else ''D-''+a.orders_restrictcount end) as restrictCount,	'
	SET @qry=@qry+char(13)+	' 		a.modifierDate ,'
	SET @qry=@qry+char(13)+	' 		b.sellermaterialcode, '
	SET @qry=@qry+char(13)+	' 		isnull(a.domesticText,'''') as remark2, '
	SET @qry=@qry+char(13)+	' 		(select handphone from client where dealerCode='''+@A_dealerCode+''' and  clientCode=a.storeCode) as handphone, '
	SET @qry=@qry+char(13)+	' 		(select address   from client where dealerCode='''+@A_dealerCode+''' and  clientCode=a.storeCode) as address '
	SET @qry=@qry+char(13)+	'	from orders a,material b '
	SET @qry=@qry+char(13)+	'	where a.dealerCode='''+@A_dealerCode+''' '
	SET @qry=@qry+char(13)+	'	and a.dealerCode=b.dealerCode '
	SET @qry=@qry+char(13)+	'	and a.materialCode=b.materialCode '
	SET @qry=@qry+char(13)+	'	and a.stockinDay between '''+@A_startDay+''' and '''+@A_endDay+''' '
SET @qry=@qry+char(13)+	') t '
	SET @qry=@qry+char(13)+	'group by rollup(stockInDay,materialCode,materialName,dimension,domesticText,realQty,unitName,sellerCode,sellerName,storeCode,storeName,isSellingvat,sellingPrice,sellingTotal,sellingAmt,sellingVat,remark,restrictCount,modifierDate,sellermaterialcode,remark2,handphone,address)) '
set @qry=@qry+char(13)+ ' order by case when stockinday is null then 1 else 0 end asc , stockinday asc,
							  case when sellercode is null then 1 else 0 end asc , sellercode asc, 
							  case when materialName is null then 1 else 0 end asc , materialName asc,
							  case when materialCode is null then 1 else 0 end asc , materialCode asc'

 

order by를 걸면 소계총계가 다 밑으로내려가더라구요

방법이있을까요 ㅠㅠ

by 마농 [2022.06.16 10:41:12]
-- 변경전 --
 ORDER BY CASE WHEN stockinday   IS NULL THEN 1 ELSE 0 END ASC, stockinday   ASC
        , CASE WHEN sellercode   IS NULL THEN 1 ELSE 0 END ASC, sellercode   ASC
        , CASE WHEN materialName IS NULL THEN 1 ELSE 0 END ASC, materialName ASC
        , CASE WHEN materialCode IS NULL THEN 1 ELSE 0 END ASC, materialCode ASC
-- 변경후 --
 ORDER BY t.stockinday
        , t.sellercode
        , t.materialName
        , t.materialCode
-- 중요 포인트 --
-- 컬럼명을 가공하여 알리아스를 줄 때 컬럼명과 동일하게 알리아스를 주는 경우에는
-- ORDER BY 절 사용에 주의를 기울여야 합니다.
-- ORDER BY stockinday 는 가공된 결과에 대한 알리아스를 의미합니다.
-- ORDER BY t.stockinday 를 하면 원본 컬럼에 대한 정렬이 됩니다.

꿈꾸는 개발자, DBA 커뮤니티 구루비 (gurubee.net)


by 마농 [2022.06.16 10:47:21]
-- 오라클의 경우 NULL 이 밑으로 가서 위과 같이 해도 되지만
-- MSSQL 의 경우에는 NULL 이 위로 가서 다르게 해야 겠네요.
-- MSSQL --
 ORDER BY GROUPING(t.stockinday  ), t.stockinday
        , GROUPING(t.sellercode  ), t.sellercode
        , GROUPING(t.materialName), t.materialName
        , GROUPING(t.materialCode), t.materialCode

 


by 지메이비 [2022.06.16 11:14:10]

답변감사합니다

품목별소계가 맨밑에 모여서 출력이 되네요 ㅠ


by 마농 [2022.06.16 11:27:11]

GROUP BY 롤업 항목은?엄청 많은데??정렬 항목은 몇개 안되네요?
뭔가 이상합니다. 정렬기준이 모호하네요.
롤업 항목 순서와 정렬항목 순서가 동일해야 할 것 같은데요.
롤업 항목들을 적절하게 괄호로 묶어줄 필요가 있습니다.


by 지메이비 [2022.06.16 12:10:55]

Stockinday > sellercode > materialname > materialcode 순으로 정렬하고싶은데 말씀하신건 rollup에있는 항목들을 다 orderby에 넣으라는말씀이신건가요??


by 마농 [2022.06.16 12:36:18]
-- 롤업 자체를 잘못 사용한 듯 합니다.
-- 변경전 : 개별 항목 롤업 --
 GROUP BY ROLLUP( stockInDay, materialCode, materialName, dimension, domesticText
                , realQty, unitName, sellerCode, sellerName, storeCode, storeName
                , isSellingvat, sellingPrice, sellingTotal, sellingAmt, sellingVat
                , remark, restrictCount, modifierDate, sellermaterialcode, remark2
                , handphone, address
                )
;
-- 변경후 : 종속항목은 괄호로 묶고, 집계항목은 제거
 GROUP BY ROLLUP( stockInDay
                , ( sellerCode, sellerName
                  , storeCode, storeName
                  , isSellingvat, sellingPrice
                  , remark, modifierDate, remark2, handphone, address
                  ) -- 종속항목은 괄호로 묶고
                , ( materialName, materialCode, dimension, domesticText
                  , unitName
                  , restrictCount
                  , sellermaterialcode
                  ) -- 종속항목은 괄호로 묶고
             -- , realQty, sellingTotal, sellingAmt, sellingVat -- 집계항목은 제거
                )
;
-- 우선 나름 정리를 해보긴 했는데...맞는지는 모르겠네요.
-- 항목들간의 종속관계가 파악되어야 합니다. (예, 이름은 코드에 종속)
-- 애초에 항목이 너무 많습니다. 불필요한 항목은 없는지? 확인 및 제거가 필요해 보입니다.

 

 


by 지메이비 [2022.06.16 13:09:04]
rollup(stockInDay,materialCode,(materialName,dimension,domesticText,realQty,unitName,	sellerCode,sellerName,storeCode,storeName,isSellingvat,sellingPrice,sellingTotal,	
sellingAmt,sellingVat,remark,restrictCount,modifierDate,sellermaterialcode,remark2,handphone,address))

아 롤업이 조금 잘못올라갔는데 stockinDay랑 materialCode를 제외한것들은 묶어놧습니다

 


by 마농 [2022.06.16 13:41:47]
-- 1. 합계항목 제거 : realQty, sellingTotal, sellingAmt, sellingVat
-- 2. 정렬순서에 맞는 롤업 순서
 GROUP BY ROLLUP ( stockInDay
                 , ( sellerCode, sellerName
                   , materialName, materialCode
                   )
                 , ( dimension, domesticText
--                 , realQty
                   , unitName, storeCode, storeName
                   , isSellingvat, sellingPrice
--                 , sellingTotal, sellingAmt, sellingVat
                   , remark, restrictCount, modifierDate, sellermaterialcode
                   , remark2, handphone, address
                   )
                 )

 


by 지메이비 [2022.06.16 13:47:40]

답변감사합니다!! 그런데 품목별소계가 사라집니다..ㅠ


by 마농 [2022.06.16 13:50:53]

정렬 순서가 materialCode 보다 sellerCode 가 우선 인게 맞는지 의문? (롤업순서와 다름)
원본 대비 결과를 표로 보여주세요. (주요?항목들 포함된 것으로)


by 지메이비 [2022.06.16 13:51:50]

 

위의사진이 원본입니다. 

그리고 댓글에있는게 알려주신대로 rollup만 바꿨습니다.

 

20200406    1515016     감자                           4.00
20200406    1515016     감자                           34.00
20200406    1515016     감자                           2666.00
20200406    1515016     감자                            4.00
20200406    1515017     감자           .                1.00
20200406    1515195     꼬막           .                1.00
20200406    1515139     닭정육        .               1.50
20200406    1515282     맛김           .               0.50
20200406    1515210     바다장어      .              1.00
20200406    1515210     바다장어      .              0.40
20200406    1515053     쑥              .               0.30
20200406    1515134     오이지        .               1.00
20200406    1515134     오이지        .               0.20
20200406    1515024     흙당근        .               1.00
20200406    1515024     흙당근        .               0.80
소계           NULL         NULL    NULL    NULL    8632.70
총계           NULL         NULL    NULL    NULL    8632.70


by 마농 [2022.06.16 13:56:08]

1. 원본일리가 없습니다. 롤업의 결과이겠죠.
2. 항목이 상당히 많은데 보여주신 항목은 몇개 안되네요. (sellerCode 정보도 보여주세요)
3. 롤업 순서가 바뀌면  Select 절도 바뀌어야 합니다. (소계 표시 조건)
4. 정렬 순서가 materialCode 보다 sellerCode 가 우선 인게 맞는지 의문? (롤업순서와 다름)


by 지메이비 [2022.06.16 14:21:32]
set @qry= ''	
	SET @qry=@qry+char(13)+	' 	select '
	SET @qry=@qry+char(13)+	' 		a.stockInDay, '
	SET @qry=@qry+char(13)+	' 		a.materialCode, '
	SET @qry=@qry+char(13)+	' 		b.materialName, '
	SET @qry=@qry+char(13)+	' 		b.dimension, '	
	SET @qry=@qry+char(13)+	' 		b.domesticText, '
	SET @qry=@qry+char(13)+	' 		a.materialQty-a.rtnQty as realQty, '
	SET @qry=@qry+char(13)+	' 		DBO.UF_UNITNAME(b.unitCode) as unitName, '
	SET @qry=@qry+char(13)+	' 		a.sellerCode, '
	SET @qry=@qry+char(13)+	' 		DBO.UF_SELLERNAME(a.dealerCode,a.sellercode) as sellerName, '
	SET @qry=@qry+char(13)+	' 		a.storeCode, '
	SET @qry=@qry+char(13)+	' 		case when a.storecode = ''9999'' then ''창고입고'' '
 	SET @qry=@qry+char(13)+	'		else ( case when len(replace(a.storetype,'' '',''''))>0 then DBO.UF_STORENAME(a.dealerCode,a.storeCode)+''(''+replace(a.storetype,'' '','''')+'')'' else DBO.UF_STORENAME(a.dealerCode,a.storeCode) end ) end as storeName, '
	SET @qry=@qry+char(13)+	' 		a.isSellingvat, '
	SET @qry=@qry+char(13)+	' 		a.sellingPrice, '
	SET @qry=@qry+char(13)+	' 		a.sellingAmt+a.sellingVat as sellingTotal, '
	SET @qry=@qry+char(13)+	' 		a.sellingAmt, '
	SET @qry=@qry+char(13)+	' 		a.sellingVat, '
	SET @qry=@qry+char(13)+	' 		a.remark, '
	SET @qry=@qry+char(13)+	' 		(case when a.orders_restrictcount is null then ''D-''+isnull(b.restrictCount,''1'') else ''D-''+a.orders_restrictcount end) as restrictCount,	'
	SET @qry=@qry+char(13)+	' 		a.modifierDate ,'
	SET @qry=@qry+char(13)+	' 		b.sellermaterialcode, '
	SET @qry=@qry+char(13)+	' 		isnull(a.domesticText,'''') as remark2, '
	SET @qry=@qry+char(13)+	' 		(select handphone from client where dealerCode='''+@A_dealerCode+''' and  clientCode=a.storeCode) as handphone, '
	SET @qry=@qry+char(13)+	' 		(select address   from client where dealerCode='''+@A_dealerCode+''' and  clientCode=a.storeCode) as address '
	SET @qry=@qry+char(13)+	'	from orders a,material b '
	SET @qry=@qry+char(13)+	'	where a.dealerCode='''+@A_dealerCode+''' '
	SET @qry=@qry+char(13)+	'	and a.dealerCode=b.dealerCode '
	SET @qry=@qry+char(13)+	'	and a.materialCode=b.materialCode '
	SET @qry=@qry+char(13)+	'	and a.stockinDay between '''+@A_startDay+''' and '''+@A_endDay+''' '

set @qry = @qry + char(13) + ' order by a.stockinday,a.sellercode,b.materialName,b.materialCode '

이게원본코드입니다..

저는 누가수정해놓은걸 바꾸려고했는데

원본에서 하는게 괜찮을까요?


by 마농 [2022.06.16 14:29:58]

정렬순서가
- stockinday, sellercode, materialName, materialCode 가 맞는지 의문
- 롤업 순서와 정렬 순서가 일치해야 합니다.
1안) 롤업 순서를 정렬 순서에 맞도록 바꾸던지
2안) 정렬 순서를 롤업 순서에 맞도록 바꾸던지


by 지메이비 [2022.06.16 14:42:31]

정렬순서는 맞습니다..

그럼 롤업순을 바꿔보겠습니다


by 마농 [2022.06.16 15:11:48]

1. 조회 항목 순서도 (sellerCode, sellerName) 을 (materialCode, materialName) 보다 앞에 두세요.
2. 소계 대상도 materialCode 만 있는데? sellerCode 별 소계도 필요한 건 아닌지?
3. 적용 방법
우선 SELECT 절의 소계 총계 표시를 위한 CASE 문을 없애고 ROLLUP 구문을 완성해 보세요
완성한 쿼리를 돌려보고 원하는 결과가 맞는지 확인하세요.
CASE 문은 그 다음에 추가.


by 지메이비 [2022.06.16 15:23:40]

넵 해결했습니다.

ORDER BY GROUPING(t.stockinday  ), t.stockinday
        , GROUPING(t.sellercode  ), t.sellercode
        , GROUPING(t.materialName), t.materialName
        , GROUPING(t.materialCode), t.materialCode

이 코드에 대한 설명이 있는 글이있을까요?


by 마농 [2022.06.16 15:29:00]

1. 위에 이미 설명 드렸는데요?
- 정렬할 때 알리아스가 아닌 원본 컬럼으로 정렬하기 위해 t. 을 붙여 줬고
- 정렬시 NULL 이 먼저 나오기 때문에 GROUPING 을 추가해 준 것입니다.
2. 해결한 쿼리를 공유해 주세요.
- rollup 부분


by 지메이비 [2022.06.16 15:40:07]
group by rollup((stockInDay),(materialName,materialCode,sellerCode),(
																		
																	dimension,
																	domesticText,	
																	realQty,	
																	unitName,	
																	sellerName,	
																	storeCode,	
																	storeName,	
																	isSellingvat,	
																	sellingPrice,	
																	sellingTotal,	
																	sellingAmt,	
																	sellingVat,	
																	remark,	
																	restrictCount,	
																	modifierDate,	
																	sellermaterialcode,	
																	remark2,	
																	handphone,	
																	address)) '

이렇게 했습니다 감사합니다


by 마농 [2022.06.16 15:47:44]

sellerCode 와 sellerName 은 한몸과 같으니 sellerName 을 앞으로 옮기면 좋을 듯 하고
sellerCode 의 정렬순서가 먼저이니 sellerCode 를 앞쪽으로 옮기는게 좋을 듯 합니다.
(sellerCode, sellerName, materialName, materialCode)
그 외 기타 항목들 중에서도 정렬 기준을 정하셔서 순서 조정 및 정렬 추가 하시는 게 좋을 듯 합니다.


by 지메이비 [2022.06.16 15:54:57]

답을 엄청 많이해주셔서 감사합니다!!!!

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