SQL 에 관 한 몇 가지 작은 문제 에 대한 상세 한 설명(sql 진급)

우리 가 문 제 를 받 았 을 때 급히 대답 하 는 것 이 아니 라 얻 는 것 보다 잃 는 것 이 많 을 것 이다.생각 을 분석 하고 어떤 방법 으로 어떤 목적 을 달성 하 는 지,간단 한 방법 이나 통용 되 는 방법 이 있 는 지 등 을 생각해 야 한다.그래 야 하나 로 열 을 당 하 는 효 과 를 얻 을 수 있다.이런 관성 사 고 는 우리 가 고등 학 교 를 다 닐 때 이미 가르침 을 받 았 다.'변 덕 스 러 워 도 그 종 을 떠 나 지 않 는 다'는 말 이 죠?아래 각 문 제 는 일상 에서 보 거나 QQ 군,면접 문제 나 블 로그 원 에서 나온다.
제목 1:아래 표 에서 보 듯 이 현 재 는 수금 원 에 따라 수금 과 환불 합계 금액 을 집계 해 야 한다.

실현 결 과 는 다음 과 같이 표시 해 야 합 니 다.

분석:원 하 는 결과(표 B 로 기록)와 소스 데이터(표 A 로 기록)에 비해 공 통 된 열(수금 원)이 있 습 니 다.표 A 의 금액 은 표시 와 수금 원 에 따라 두 열 로 나 뉘 었 기 때문에 이 수 요 는 언어 로 표현 할 수 있 습 니 다.먼저 수금 원 에 따라 그룹(group by)을 나 눈 다음 에'수령'으로 표시 할 때 금액 은 수금 합계(sum)에 계산 합 니 다.'환불'이 라 고 표 시 될 때 금액 은 환불 합계(sum)에 계산한다.....................................................................SQL 을 점검 하 는 조건문 이 많 지 않 습 니 다.if...else...와 case...when...then...else...end.이렇게 하면 문제 가 쉽게 풀린다.
해결 방안 은 다음 과 같다.

with ta as
(select ' ' as   ,'100' as    ,150 as   
 union
 select ' ','100',375
 union
 select ' ','100',78
 union select ' ','200',74
)

select    ,sum(case when   =' ' then    else 0 end) as     ,
 sum(case when   =' ' then    else 0 end) as      from ta
 group by    
제목 2:아래 표 A(왼쪽)직원 정보 표 에서 ID 는 직원 번호 이 고 name 은 직원 이름 입 니 다.표 B(오른쪽)는 직원 임무 배정 표 이 고 그 중에서 ID 는 직원 번호(표 A 의 ID 와 대응)이 며 Task 는 임무 번호 이다.

현재 각 직원 의 임무 수가 필요 하 다.결 과 는 다음 과 같 습 니 다.

사실 원 제 는 이 렇 습 니 다.표 B 한 장 만 있 고 모든 직원 의 임무 수 를 구 합 니 다.비교적 좋 은 방법 을 찾 지 못 해 실현 되 었 으 니 토론 을 하지 않 고 높 은 사람의 지 도 를 환영 합 니 다.
분석:이 문제 의 어 려 운 점 은 표 B 의 ID 가 복잡 하 게 나타 나 는데 사실은 데이터 뱅 크 의 디자인 원칙 에 어 긋 나 므 로 표 A 와 표 B 의 ID 가 일일이 대응 해 야 한 다 는 것 이다.문제 인 만큼 우 리 는 현재 의 조건 에 착안 할 수 밖 에 없다.어 려 운 점 을 해결 하 는 관건 은 A 에서 ID 가 B 에서 ID 가 나타 나 는 지 여 부 를 판단 하 는 것 이다.만약 에 나타 나 면 나타 나 는 횟수 를 어떻게 통계 하 느 냐 하 는 것 이다.출현 여 부 를 판단 하려 면 함수 CHARINDEX 가 필요 합 니 다.
해결 방안 은 다음 과 같다.

--      
WITH TA
AS
(SELECT '1,2' AS ID,'job1' AS task
UNION SELECT '1,2,3','job3'
UNION SELECT '2,3','job2'
UNION SELECT '3,4,5','job4')
,TB AS 
(SELECT '1' AS ID,'  ' as name
UNION SELECT '2','  '
UNION SELECT '3','  '
UNION SELECT '4','  '
UNION SELECT '5','  ')

SELECT B.ID,B.name,COUNT(1) AS TASKS
 FROM TA A,TB B
 WHERE CHARINDEX(B.ID,A.ID)>0
 GROUP BY B.ID,B.name
 order by B.ID
제목 3:원 제 는 이 문장 을 참조한다:https://www.jb51.net/article/67885.htm
아래 표 에서 보 듯 이 code 는 행정구 역 코드(6 자리 숫자,앞의 두 개 는 성급 을 대표 하고 중간 두 개 는 시 급 을 대표 하 며 마지막 두 개 는 현급 을 대표 하 며 xx 00 xx 상황 을 고려 하지 않 음)이 고 city 는 도시 명칭 이 며 CCode 는 이 도시 가 속 한 성급 또는 시 급 행정구 역 코드 이다.

현재 수 요 는 다음 과 같다.

분석:분석 표 city,code 의 의미 가 매우 뚜렷 하고 필요 한 결과 도 뚜렷 하 다.성 이 라면 성 을 나타 내 는 것 이다.시 는 소속 성급+시 급 으로 표 시 됩 니 다.현급 이면 소속 성급+소속 시 급+현급 으로 나타난다.제목 분석 에서 언급 한 SQL 조건문 으로 실현 할 수 있 을 것 같 지만 다시 생각해 보면 차이 가 있 습 니 다.여기 서 city 가 성급 에 속 하 는 지 판단 해 야 합 니 다.시 급현급그리고 대응 하 는 것 은 참조 표 가 있어 야 하고 복잡 하 다.결과 표 에 돌아 와 분석 한 결과 city 가 성 시 현 에 속 하 는 문 제 를 판정 하 는 것 은 어렵 지 않다.code 의 의 미 는 이미 설명 되 었 다.표 City 에서 code 의 뒤에 네 자리 가'0000'일 때 성급 이 분명 하 다.code 의 뒷 두 자리 가'00'이 고 뒷 네 자리 가'0000'이 아 닐 때 시 급 이 분명 합 니 다.코드 후 두 분 이'00'이 아 닐 때 현급 입 니 다.이렇게 해서 성,시,현의 판정 은 일목요연 해 졌 다.그 다음 에 시 급 코드 에 따라 소속 성급 을 추 삭 하고 소속 성급+시 급,현급 추 삭 이 속 한 시 급 을 얻어 소속 성급+소속 시 급+소속 현급 을 얻 었 다.이런 간단 한 귀속 사상 을 활용 하여 해결 방안 이 종이 에 올 랐 다.
해결 방안 은 다음 과 같다.

--    
with ta as
(select '110000' as code, '   ' city, '110000' Ccode
union
select N'110200', N'   ', N'110200'
union
select N'110300', N'   ', N'110300'
union
select N'430000', N'   ', N'430000'
union
select N'430100', N'   ', N'430100'
union
select N'430101', N'   ', N'430100')

select * into City from ta

select * from City;

--    
with ta
as(
--  
select code,city,Ccode,city content from City where right(code,4)='0000'),
tb as(
--  
select b.code,b.city,b.Ccode,a.city+','+b.city as content from ta a,City b where left(a.Ccode,2)=left(b.Ccode,2)
and right(b.code,2)='00' and right(b.code,4)<>'0000'),
tc as(
select c.code,c.city,c.Ccode,b.content+','+c.city content from tb b,City c where left(b.Ccode,4)=left(c.Ccode,4)
and right(c.code,2)<>'00')
select * from ta
union
select * from tb
union
select * from tc
상기 몇 개의 작은 문 제 를 통 해 항상 새로운 것 을 생각 하고 SQL 의 일부 지식 을 복습 했다.물론 방법 이 많 고 변화 가 많다.예 를 들 어 문제 2 통계 표 B 에서 모든 Task 의 인원수 등 이다.부족 한 점 은 여러분 의 지적 을 환영 합 니 다!

좋은 웹페이지 즐겨찾기