SQL 에 관 한 몇 가지 작은 문제 에 대한 상세 한 설명(sql 진급)
5692 단어 작은 문 제 를 상세 하 게 풀다.
제목 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 의 인원수 등 이다.부족 한 점 은 여러분 의 지적 을 환영 합 니 다!