코딩

예매율구하기

야생늑대 2022. 4. 13. 19:14
반응형

 

이번 주는 학원에서 영화사이트 관련 기능들 구현하고 있는데   오늘은 예매하기 만드는데 3~4시간 걸리고

예매율구하는는데 3시간은 헤맨듯하다.  작업한 시간의 반을 예매율 구하는데 썼다. 이게 뭐라고..

  막상 해놓고 보면 그렇게 어려운 게 아닌데 어떻게 해야 할지 감을 못 잡아서 고민과 수정을 반복하느라 많은

 시간을 썼다.  선생님한테 물어보고 설명을 들었는데도 금방 이해 못 하고 헤매다가 완성했다.

  선생님은 SQL문으로 구할 수도 있는데 그것보다는 셀렉트로 영화별 예매 횟수만 구해서 가져오고 자바에서

작업하는 것이 더 나을 거라고 하셔서 이렇게 연습해봤다.

  근데 이게 제대로 한 건지 모르겠다.

  ↓ 혼자 해본 것 (22/04/14)

더보기

(예매율 구하려는 이것저것 수정하면서 나누기를 아무리 해봐도 0 만나와 가지고 타입 때문인가 해서 책 찾아보고

  나서야 알았다.   정수끼리 나누면 값이 정수로 나와야 하므로  소수점 이하는 버려지고 결과 값이 나온다.
  그래서 1/6,  2/6  아무리 해도 값은 0 나오고  0에 100을 곱하니 다시 0이 나왔던 거였다.
해결법은 피연산자 중 하나라도 실수 타입 이어야 소수점까지 나오는 결괏값이 나오고 그 값에 100을 곱하고 정수 변환

해줘야 깔끔하게 예매율이 나온다.)

※ 예매율 구하기   

  Reservation 테이블에서 예매 영화 이름과 , 영화의 예매 횟수를 가져오기 위한 메소드와 총 예매 횟수를 구하기 위한

  메소드를 만든다.

  메소드에서 SELECT문을 실행. 값을 구하고 리턴 받아 변수에 저장한다.

  for문으로 나오는 영화별 예매 횟수를 총 예매 횟수를 담은 변수로 나눈다.

   (이때 피연산자 둘 중 하나는 실수 타입으로 변환해서 연산한다.)

   실수인 결괏값을 정수로 타입 변환해서 * 100을 곱한 뒤  정수 타입 변수에 저장한다.

   출력할 때 % 붙여서 출력하면 된다.

 

 

 22/04/14 수정

 

 어제는 영화가 예매된 횟수로 예매율을 구해서 

 오늘은 인원수로 예매율 구하려고 고민하다가 전체 예매인원수 구하질 못해서 선생님께 물어보니 방법을 알려주셨고  

   출력된 거 보시고는 영화가 6개인데 5개밖에 출력이 안되고 있다고 뭘 추가해야 한다고 말씀해주셔서

   다른 것들이랑 같이 수정해봤다. 

  •  LEFT OUTER JOIN을 사용해서 값이 없는 열도 출력
  • 예매가 한 번도 안된 영화는 NULL 값이 나오므로 NVL을 사용한다.
  •     처음에 NVL을 서브 쿼리에 넣어줬더니 적용이 안돼서 NULL 값이 나오길래  메인 쿼리에 사용했더니 0으로 출력되었다.
  • 예매인원수 구하는 건   SUM을 사용한다.
  • 전체 인원수는 SELECT SUM(REAMOUNT) FROM RESERVATION;
  •  정수 타입 변환해서 예매율을 구하면 소수점 부분은 버려 지기 때문에 좀 더 정확한 표현을 위해서 실수 타입에 MATH.ROUND를 사용한다.
  • 영화 목록 나올 때 같이 출력되도록 하려고 하니  영화 목록 메소드하고 하고 인원수 메소드하고 영화 순서가 달라서   영화 예매를 하면  선택 한영화가 아니고 다른 영화에 인원이 추가되었다. 그래서 둘 다 ORDER BY MVCODE로 통일해줬다.   

     선생님이 하신 것을 참조해서 SQL문을 작성했더니 영화 목록메소드의 SELECT문에 SUM 하고 COUNT만 추가된 거라서       영화 목록 지우고 그 자리에 이 메소드를  대체해서 쓸 수 있었다.   

    그냥 따로 메소드를 안 만들고  영화목록 메소드를 수정하는 게 빠를뻔했다.  

 

 

 

MATH클래스

▶수학계산에 사용할 수 있는 메소드를 제공하며, Math클래스가 제공하는 메소드는 모두 정적 메소드 이므로

 Math 클래스로 바로 사용할 수 있다.

▶ round() 메소드는 항상 소수점 첫째 자리에서 반올림한다. 만약 원하는 소수 자릿수에서 반올림 값을 얻으려면 

   반올림할 자릿수가 소수점 첫째 자리가 되도록 10의 배수를 곱한 후, round()메소드의 리턴 값을 얻는다. 

    그리고 다시 10의 배수로 나눠주면 된다.

	double Result = 3 / (double) 7 * 100;     //   값 =  42.8571429
	
    double Result2 = Math.round(Result * 100) / 100.0;   
      // 값 42.86 
      // 100을 곱하면 4285.71429 가 되어서 소수점 첫째자리가 7이므로 7을 반올림해서
      // 4286 이 된다. 그리고 다시 100을 나눠주면 42.86이 나온다.
      
    double Result3 = Math.round(Result * 1000) / 1000.0;   // 값 42.857

 

 

 split함수

String 타입으로 선언된 변수를 특정 문자나 정규표현식을 기준으로 나누어 배열에 저장하는 함수

표현방법에는 두 가지가 있다.

 

1. String [] split(String Regex)

ex)

String str = "2016-12-06";               

String [] date = str.split("-");   

date [0] = "2016" 

date [1] = "12"

date [2] = "06"  이 저장된다.

2. String [] split(String Regex, int limit)

String str = "2016-12-06";             

String[] date = str.split( "-",2 );   <--이런 식으로 두 번째 인자에 정수(int)를 넣어서 배열의 크기를 정할 수 있다.

date [0] = "2016"

date [1] = "12-06"   

지정된 배열의 크기를 넘어 더 이상 생성될 수 없기 때문에 나머지 문자열이 모두 [1] 인덱스에 들어갔다.

 

 

 

 

 

 

반응형

'코딩' 카테고리의 다른 글

오늘의 에러 22/04/15  (0) 2022.04.15