테스트 사이트 - 개발 중인 베타 버전입니다

SQL 질문드립니다.. 채택완료

해금해금 4년 전 조회 2,300

+-----------------+--------------+--------+--------+-----------+-----------+ | 고객아이디      | 고객이름     | 나이   | 등급   | 직업      | 적립금    | +-----------------+--------------+--------+--------+-----------+-----------+ | apple           | 정소화       |     20 | gold   | 학생      |      1000 | | banana          | 김선우       |     25 | vip    | 간호사    |      2500 | | carrot          | 고명석       |     28 | gold   | 교사      |      4500 | | melon           | 성원용       |     35 | gold   | 회사원    |      5000 | | orange          | 김용욱       |     22 | silver | 학생      |         0 | | peach           | 오형준       |   NULL | silver | 의사      |       300 | | pear            | 채광주       |     31 | silver | 회사원    |       500 | +-----------------+--------------+--------+--------+-----------+-----------+  

gold’ 등급의 고객명과 적립금, 등급별 적립금 평균과의 차액 리스트를 적립금에 대해 내림차순으로

출력하려고 할때 등급별 적립금 평균과의 차액 리스트를 어떤식으로 작성해야 할까요..?

 

SELECT 고객이름,적립금

FROM 고객

WHERE 등급='gold'

oder by 적립금 desc;

댓글을 작성하려면 로그인이 필요합니다.

답변 4개

플래토
4년 전

테스트하기 좋은 샘플같아서 

mysql로 간단히 구현해봤습니다.

원하시는 결과가 맞는지는 모르겟으나, 소숫점등은 알아서 변경하시면됩니다.

 

</p>

<p>/*</p>

<p>gold’ 등급의 고객명과 적립금, 등급별 적립금 평균과의 차액 리스트를 적립금에 대해 내림차순으로</p>

<p>출력하려고 할때 등급별 적립금 평균과의 차액 리스트를 어떤식으로 작성해야 할까요..?

*/</p>

<p>CREATE TABLE `test1` (

    `NO` INT(11) NOT NULL AUTO_INCREMENT,

    `id` VARCHAR(20) NULL DEFAULT '' COLLATE 'utf8_general_ci',

    `name` VARCHAR(30) NULL DEFAULT '' COLLATE 'utf8_general_ci',

    `age` VARCHAR(30) NULL DEFAULT '' COLLATE 'utf8_general_ci',

    `LEVEL` VARCHAR(30) NULL DEFAULT '' COLLATE 'utf8_general_ci',

    `job` VARCHAR(30) NULL DEFAULT '' COLLATE 'utf8_general_ci',

    `point` INT(11) NULL DEFAULT '0',

    PRIMARY KEY (`NO`) USING BTREE

)

COLLATE='utf8_general_ci'

ENGINE=InnoDB

;</p>

<p>

INSERT INTO `test1` (`NO`, `id`, `name`, `age`, `LEVEL`, `job`, `point`) VALUES (1, 'apple', '정소화', '20', 'gold', '학생', 1000);

INSERT INTO `test1` (`NO`, `id`, `name`, `age`, `LEVEL`, `job`, `point`) VALUES (2, 'banana', '김선우', '25', 'vip', '간호사', 2500);

INSERT INTO `test1` (`NO`, `id`, `name`, `age`, `LEVEL`, `job`, `point`) VALUES (3, 'carrot', '고명석', '28', 'gold', '교사', 4500);

INSERT INTO `test1` (`NO`, `id`, `name`, `age`, `LEVEL`, `job`, `point`) VALUES (4, 'melon', '성원용', '35', 'gold', '회사원', 5000);

INSERT INTO `test1` (`NO`, `id`, `name`, `age`, `LEVEL`, `job`, `point`) VALUES (5, 'orange', '김용욱', '22', 'silver', '학생', 0);

INSERT INTO `test1` (`NO`, `id`, `name`, `age`, `LEVEL`, `job`, `point`) VALUES (6, 'peach', '오형준', 'NULL', 'silver', '의사', 300);

INSERT INTO `test1` (`NO`, `id`, `name`, `age`, `LEVEL`, `job`, `point`) VALUES (7, 'pear', '채광주', '31', 'silver', '회사원', 500);</p>

<p>SELECT  

    a.id,

    a.name,

    a.age,

    a.job,

    a.level,

    a.point,

    (

        (

            SELECT 

                SUM(POINT) sp 

            FROM test1 b

            WHERE LEVEL = a.`LEVEL`

        ) / 

        (

            SELECT 

                COUNT(LEVEL) 

            FROM test1 b

            WHERE LEVEL = a.`LEVEL`

        )

    ) AS AVG

    ,

    a.point - (

        (

            SELECT 

                SUM(POINT) sp 

            FROM test1 b

            WHERE LEVEL = a.`LEVEL`

        ) / 

        (

            SELECT 

                COUNT(LEVEL) 

            FROM test1 b

            WHERE LEVEL = a.`LEVEL`

        )

    ) AS cha

FROM test1 a

ORDER BY cha;

 </p>

<p>

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

oracle 퀴즈 같습니다. mysql로는 여러 번 query 실행해야 될 거 같습니다.

원하시는 결과를 표로 만들어 주셔야 명확할 거 같습니다.

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

이런식으로 서브쿼리 쓰시면 될것 같습니다.

join으로 하는게 더 좋을거 같은데 음...그건 한번 생각해보심이....

 

select     a.고객이름,      a.적립금,     (select avg(적립금)-a.적립금 from 고객 where 등급=a.등급) as 차액 from     고객 as a where      a.등급='gold' order by      a.적립금 desc;

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

w
4년 전

골드에버리지 먼저 계산해서 변수에 넣고 WHILE 돌릴때 빼서 차액 계산해서 테이블에 같이 출력하면 될것같은데요. 문의사항이 이게 맞는지..

로그인 후 평가할 수 있습니다

댓글을 작성하려면 로그인이 필요합니다.

답변을 작성하려면 로그인이 필요합니다.

로그인