database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
ㆍMS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MS-SQL Q&A 6682 게시물 읽기
No. 6682
쿼리문을 어떻게 만들지 .. 쿼리문을 만들고 싶습니다.
작성자
둥둥이
작성일
2013-06-14 19:35ⓒ
2013-06-15 01:33ⓜ
조회수
8,613

 쿼리문을 어떻게 만들어야 될지 모르겠습니다.

아래는 테이블 구조입니다.

판매테이블

고객코드 판매대금 판매년도 고객담당자
a 1000 2010 사원1
b 1500 2010 사원2
c 2000 2010 사원1
d 2000 2010 사원2
a 2100 2011 사원1
d 3500 2011 사원2
c 5100 2011 사원1

입금테이블

고객코드 입금대금 입금년도 고객담당자
a 1000 2010 사원1
c 500 2010 사원1
b 1000 2010 사원2
a 1000 2011 사원1
b 1000 2011 사원2
d 1000 2011 사원2
c 1000 2011 사원1

쿼리해서 나오게하고싶은 결과값은

a의사원 집계

2010고객수 2011고객수 2010판매금액 2011판매금액 판매금액합계 2010입금액 2011입금액 입금액합계 2010미수 2011미수 미수금합계
2 2 3000 7200 10200 1500 2000 3500 1500 5200 6700



고수님들의 조언을 부탁드립니다.

이 글에 대한 댓글이 총 4건 있습니다.

 -- 옆으로 늘어트리는 게 좀 힘들었던.. ㅋ

CREATE TABLE #판매테이블(
고객코드 CHAR(1)
, 판매대금 INT
, 판매년도 INT
, 고객담당자 NVARCHAR(10)
)
;
INSERT INTO #판매테이블( 고객코드, 판매대금, 판매년도, 고객담당자 )
SELECT 'a', 1000, 2010, N'사원1' UNION ALL
SELECT 'b', 1500, 2010, N'사원2' UNION ALL
SELECT 'c', 2000, 2010, N'사원1' UNION ALL
SELECT 'd', 2000, 2010, N'사원2' UNION ALL
SELECT 'a', 2100, 2011, N'사원1' UNION ALL
SELECT 'd', 3500, 2011, N'사원2' UNION ALL
SELECT 'c', 5100, 2011, N'사원1'
;
CREATE TABLE #입금테이블(
고객코드 CHAR(1)
, 입금대금 INT
, 입금년도 INT
, 고객담당자 NCHAR(30)
)
;
INSERT INTO #입금테이블( 고객코드, 입금대금, 입금년도, 고객담당자 )
SELECT 'a', 1000, 2010, N'사원1'
UNION ALL SELECT 'c', 500, 2010, N'사원1'
UNION ALL SELECT 'b', 1000, 2010, N'사원2'
UNION ALL SELECT 'a', 1000, 2011, N'사원1'
UNION ALL SELECT 'b', 1000, 2011, N'사원2'
UNION ALL SELECT 'd', 1000, 2011, N'사원2'
UNION ALL SELECT 'c', 1000, 2011, N'사원1'
;
 
SELECT 
COALESCE( 판매년도, 입금년도 ) AS '년도'
, CASE WHEN panCust >= ibCust THEN panCust
WHEN panCust < ibCust THEN ibCust
ELSE COALESCE( panCust, ibCust ) END AS '고객수'
, ISNULL( pamt, 0 ) AS '판매금액'
, ISNULL( ibamt, 0 ) AS '입금금액'
, ISNULL( pamt, 0 ) - ISNULL( ibamt, 0 ) AS '미수금액'
INTO #임시집계
FROM
(
SELECT 판매년도, COUNT( DISTINCT 고객코드 ) AS panCust, SUM( 판매대금 ) AS pamt
FROM #판매테이블
WHERE 고객담당자 = N'사원1'
GROUP BY 판매년도
) AS aa
FULL OUTER JOIN
(
SELECT 입금년도, COUNT( DISTINCT 고객코드 ) AS ibCust, SUM( 입금대금 ) AS ibamt
FROM #입금테이블
WHERE 고객담당자 = N'사원1'
GROUP BY 입금년도
) AS bb ON aa.판매년도 = bb.입금년도
;
 
DECLARE @sql NVARCHAR(MAX) = N''
 
DECLARE @년도 INT
 
DECLARE @고객필드 NVARCHAR(MAX) = N'';
DECLARE @고객필드값 NVARCHAR(MAX) = N'';
DECLARE @고객수 INT;
 
DECLARE @판매필드 NVARCHAR(MAX) = N'';
DECLARE @판매필드값 NVARCHAR(MAX) = N'';
DECLARE @판매금액 INT = 0;
DECLARE @판매합 INT = 0;
 
DECLARE @입금필드 NVARCHAR(MAX) = N'';
DECLARE @입금필드값 NVARCHAR(MAX) = N'';
DECLARE @입금금액 INT = 0
DECLARE @입금합 INT = 0;
 
DECLARE @미수필드 NVARCHAR(MAX) = N'';
DECLARE @미수필드값 NVARCHAR(MAX) = N'';
DECLARE @미수금액 INT = 0;
DECLARE @미수합 INT = 0;
 
DECLARE yc CURSOR FOR
SELECT 년도, 고객수, 판매금액, 입금금액, 미수금액 FROM #임시집계 ORDER BY 년도;
OPEN yc;
 
FETCH NEXT FROM yc INTO @년도, @고객수, @판매금액, @입금금액, @미수금액;
 
WHILE @@FETCH_STATUS = 0
BEGIN
SET @고객필드 = @고객필드 + N',[' + CAST( @년도 AS NVARCHAR(MAX) ) + N'고객수] INT';
SET @고객필드값 = @고객필드값 + CAST( @고객수 AS NVARCHAR(MAX) ) + ',';
SET @판매필드 = @판매필드 + N',[' + CAST( @년도 AS NVARCHAR(MAX) ) + N'판매금액] INT';
SET @판매필드값 = @판매필드값 + CAST( @판매금액 AS NVARCHAR(MAX) ) + ',';
SET @판매합 = @판매합 + @판매금액;
SET @입금필드 = @입금필드 + N',[' + CAST( @년도 AS NVARCHAR(MAX) ) + N'입금금액] INT';
SET @입금필드값 = @입금필드값 + CAST( @입금금액 AS NVARCHAR(MAX) ) + ',';
SET @입금합 = @입금합 + @입금금액;
SET @미수필드 = @미수필드 + N',[' + CAST( @년도 AS NVARCHAR(MAX) ) + N'미수금액] INT';
SET @미수필드값 = @미수필드값 + CAST( @미수금액 AS NVARCHAR(MAX) ) + ',';
SET @미수합 = @미수합 + @미수금액;
FETCH NEXT FROM yc INTO @년도, @고객수, @판매금액, @입금금액, @미수금액;
END
CLOSE yc;
DEALLOCATE yc;
 
SET @sql = N'CREATE TABLE #퐈이날( ' + STUFF(@고객필드, 1, 1, '') + @판매필드 + ',판매금액합계 INT' + @입금필드 + ',입금금액합계 INT' + @미수필드 + ',미수금액합계 INT);INSERT INTO #퐈이날 VALUES( ' + @고객필드값 + @판매필드값 + CAST( @판매합 AS NVARCHAR(MAX) ) + N', ' + @입금필드값 + CAST( @입금합 AS NVARCHAR(MAX) ) + N', ' + @미수필드값 + CAST( @미수합 AS NVARCHAR(MAX) ) + N');SELECT * FROM #퐈이날;';
EXEC( @sql );
 
우욱님이 2013-06-15 06:37에 작성한 댓글입니다. Edit

우욱님 답변 정말 감사합니다. ^^

제가 질문을 할때 좀더 정확하고 질문을 드리지 못했네요.

현재 사용하는 DB서버는 2000서버입니다.

 그리고 제가 쿼리해서 나오게하고싶은 결과값은 

아래표의 2행만 나오게 하고 싶습니다. (노란색배경만)

a사원 집계

 

2010고객수 2011고객수 2010판매금액 2011판매금액 판매금액합계 2010입금액 2011입금액 입금액합계 2010미수 2011미수 미수금합계
2 2 3000 7200 10200 1500 2000 3500 1500 5200 6700

 

둥둥이님이 2013-06-17 13:38에 작성한 댓글입니다. Edit

WITH 판매테이블(고객코드, 판매대금, 판매년도, 고객담당자) AS
(
SELECT 'a', 1000, 2010, '사원1'
UNION ALL SELECT 'b', 1500, 2010, '사원2'
UNION ALL SELECT 'c', 2000, 2010, '사원1'
UNION ALL SELECT 'd', 2000, 2010, '사원2'
UNION ALL SELECT 'a', 2100, 2011, '사원1'
UNION ALL SELECT 'd', 3500, 2011, '사원2'
UNION ALL SELECT 'c', 5100, 2011, '사원1'
)
, 입금테이블(고객코드, 입금대금, 입금년도, 고객담당자) AS
(
SELECT 'a', 1000, 2010, '사원1'
UNION ALL SELECT 'c',  500, 2010, '사원1'
UNION ALL SELECT 'b', 1000, 2010, '사원2'
UNION ALL SELECT 'a', 1000, 2011, '사원1'
UNION ALL SELECT 'b', 1000, 2011, '사원2'
UNION ALL SELECT 'd', 1000, 2011, '사원2'
UNION ALL SELECT 'c', 1000, 2011, '사원1'
)
SELECT COUNT(DISTINCT "2010고객수") "2010고객수"
     , COUNT(DISTINCT "2011고객수") "2011고객수"
     , SUM("2010판매금액") "2010판매금액"
     , SUM("2011판매금액") "2011판매금액"
     , SUM("판매금액합계") "판매금액합계"
     , SUM("2010입금액"  ) "2010입금액"
     , SUM("2011입금액"  ) "2011입금액"
     , SUM("입금액합계"  ) "입금액합계"
     , SUM("2010판매금액") - SUM("2010입금액") "2010미수"
     , SUM("2011판매금액") - SUM("2011입금액") "2011미수"
     , SUM("판매금액합계") - SUM("입금액합계") "미수금합계"
  FROM (
        SELECT CASE 판매년도 WHEN 2010 THEN 고객코드 END "2010고객수"
             , CASE 판매년도 WHEN 2011 THEN 고객코드 END "2011고객수"
             , CASE 판매년도 WHEN 2010 THEN 판매대금 END "2010판매금액"
             , CASE 판매년도 WHEN 2011 THEN 판매대금 END "2011판매금액"
             , 판매대금 "판매금액합계"
             , NULL "2010입금액"
             , NULL "2011입금액"
             , NULL "입금액합계"
          FROM 판매테이블
         WHERE 판매년도 IN (2010, 2011)
           AND 고객담당자 = '사원1'
         UNION ALL
        SELECT NULL "2010고객수"
             , NULL "2011고객수"
             , NULL "2010판매금액"
             , NULL "2011판매금액"
             , NULL "판매금액합계"
             , CASE 입금년도 WHEN 2010 THEN 입금대금 END "2010입금액"
             , CASE 입금년도 WHEN 2011 THEN 입금대금 END "2011입금액"
             , 입금대금 "입금액합계"
          FROM 입금테이블
         WHERE 입금년도 IN (2010, 2011)
           AND 고객담당자 = '사원1'
        ) a
;

마농(manon94)님이 2013-06-17 14:04에 작성한 댓글입니다.

우욱님, 마농님 답변 정말 감사합니다. ^^

많이 배웠씁니다.

둥둥이님이 2013-06-17 14:28에 작성한 댓글입니다. Edit
[Top]
No.
제목
작성자
작성일
조회
6685합계 구하기 질문입니다.^^ [3]
쿼리문
2013-06-19
8227
6684LEFT JOIN 대체방법 [2]
박판규
2013-06-19
7705
6683[질문]group sum질문 드립니다. [1]
안동석
2013-06-18
7746
6682쿼리문을 어떻게 만들지 .. 쿼리문을 만들고 싶습니다. [4]
둥둥이
2013-06-14
8613
6681쿼리문 질문좀 드리겠습니다.^^ [1]
SH
2013-06-14
7527
6679MS-SQL 해당년도 주(week) 구하기 [2]
홍길동
2013-06-11
8704
6678시작 날짜와 종료 날짜 기간 동안의 특정 시간대의 데이터 검색 [2]
궁금이
2013-06-11
10890
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.048초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다