SQL 질문드립니다..
본문
+-----------------+--------------+--------+--------+-----------+-----------+
| 고객아이디 | 고객이름 | 나이 | 등급 | 직업 | 적립금 |
+-----------------+--------------+--------+--------+-----------+-----------+
| 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
골드에버리지 먼저 계산해서 변수에 넣고 WHILE 돌릴때 빼서 차액 계산해서 테이블에 같이 출력하면 될것같은데요. 문의사항이 이게 맞는지..
이런식으로 서브쿼리 쓰시면 될것 같습니다.
join으로 하는게 더 좋을거 같은데 음...그건 한번 생각해보심이....
select
a.고객이름,
a.적립금,
(select avg(적립금)-a.적립금 from 고객 where 등급=a.등급) as 차액
from
고객 as a
where
a.등급='gold'
order by
a.적립금 desc;
oracle 퀴즈 같습니다. mysql로는 여러 번 query 실행해야 될 거 같습니다.
원하시는 결과를 표로 만들어 주셔야 명확할 거 같습니다.
테스트하기 좋은 샘플같아서
mysql로 간단히 구현해봤습니다.
원하시는 결과가 맞는지는 모르겟으나, 소숫점등은 알아서 변경하시면됩니다.
/*
gold’ 등급의 고객명과 적립금, 등급별 적립금 평균과의 차액 리스트를 적립금에 대해 내림차순으로
출력하려고 할때 등급별 적립금 평균과의 차액 리스트를 어떤식으로 작성해야 할까요..?
*/
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
;
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);
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;