안녕하세요?

한번의 query로 도저히 될지 안될지 알수가 없어서 여러 님들께 질문 드립니당..
데이터의 순위를 1,2,3위를 계산하고요..
1,2,3위 이외의 나머지는 합계로 계산해야 하는 형식인데요..
어떤식으로 처리 해야 할지요?
데이터의 예는 
구분 부품명 업체
A01 AA A
A01 AA B
A01 AA B
A01 AA B
A01 BB A
A01 BB A
A01 BB A
A01 BB A
A01 CC A
A01 CC B
A01 CC C
A01 CC A
A01 DD A
A01 DD C
A01 DD C
A01 DD C
A01 DD C
A01 DD D
A01 EE D
A01 EE D
A01 EE D
A01 EE D
A01 EE D
A01 EE C
A01 EE C
B01 AA A
B01 AA A
B01 AA B
B01 AA B
B01 AA A
B01 AA A
B01 BB C
B01 BB D
B01 BB D
B01 BB D
B01 BB D
B01 BB D
B01 CC A
B01 CC A
B01 CC B
B01 DD B
B01 DD C
B01 DD D
B01 DD A
B01 DD A
B01 DD B
B01 DD B
B01 DD C
B01 DD D
B01 EE D
B01 EE A
이런 식이구요...
나와야 하는 값은..

구분 No 부품명 업체 건수 비율
A01 1 EE D 5 20.00%
A01 2 BB A 4 16.00%
A01 2 DD C 4 16.00%
A01 기타     12 48.00%
  합계     25 100%
B01 1 BB D 5 19.23%
B01 2 AA A 4 15.38%
B01 3 DD B 3 11.54%
B01 기타     14 53.85%
  합계     26 100%

이렇습니당...

어떤 식으로 접근해야 할까요?
row_number() over (partition by  구분   order by  COUNT(*) DESC) row_num 이렇게
해서 row number구하고 count하고 했는데 잘 안되내요..

고수님들 부탁 드려용~~

추 천 글 등 록 목록보기 

댓글 목록
  • ET [2011년 06월 22일 13시]

    WITH T AS 
    ( 
    SELECT 'A01' CD, 'AA' A, 'A' B FROM DUAL UNION ALL 
    SELECT 'A01' CD, 'AA' A, 'B' B FROM DUAL UNION ALL 
    SELECT 'A01' CD, 'AA' A, 'B' B FROM DUAL UNION ALL 
    SELECT 'A01' CD, 'AA' A, 'B' B FROM DUAL UNION ALL 
    SELECT 'A01' CD, 'BB' A, 'A' B FROM DUAL UNION ALL 
    SELECT 'A01' CD, 'BB' A, 'A' B FROM DUAL UNION ALL 
    SELECT 'A01' CD, 'BB' A, 'A' B FROM DUAL UNION ALL 
    SELECT 'A01' CD, 'BB' A, 'A' B FROM DUAL UNION ALL 
    SELECT 'A01' CD, 'CC' A, 'A' B FROM DUAL UNION ALL 
    SELECT 'A01' CD, 'CC' A, 'B' B FROM DUAL UNION ALL 
    SELECT 'A01' CD, 'CC' A, 'C' B FROM DUAL UNION ALL 
    SELECT 'A01' CD, 'CC' A, 'A' B FROM DUAL UNION ALL 
    SELECT 'A01' CD, 'DD' A, 'A' B FROM DUAL UNION ALL 
    SELECT 'A01' CD, 'DD' A, 'C' B FROM DUAL UNION ALL 
    SELECT 'A01' CD, 'DD' A, 'C' B FROM DUAL UNION ALL 
    SELECT 'A01' CD, 'DD' A, 'C' B FROM DUAL UNION ALL 
    SELECT 'A01' CD, 'DD' A, 'C' B FROM DUAL UNION ALL 
    SELECT 'A01' CD, 'DD' A, 'D' B FROM DUAL UNION ALL 
    SELECT 'A01' CD, 'EE' A, 'D' B FROM DUAL UNION ALL 
    SELECT 'A01' CD, 'EE' A, 'D' B FROM DUAL UNION ALL 
    SELECT 'A01' CD, 'EE' A, 'D' B FROM DUAL UNION ALL 
    SELECT 'A01' CD, 'EE' A, 'D' B FROM DUAL UNION ALL 
    SELECT 'A01' CD, 'EE' A, 'D' B FROM DUAL UNION ALL 
    SELECT 'A01' CD, 'EE' A, 'C' B FROM DUAL UNION ALL 
    SELECT 'A01' CD, 'EE' A, 'C' B FROM DUAL UNION ALL 
    SELECT 'B01' CD, 'AA' A, 'A' B FROM DUAL UNION ALL 
    SELECT 'B01' CD, 'AA' A, 'A' B FROM DUAL UNION ALL 
    SELECT 'B01' CD, 'AA' A, 'B' B FROM DUAL UNION ALL 
    SELECT 'B01' CD, 'AA' A, 'B' B FROM DUAL UNION ALL 
    SELECT 'B01' CD, 'AA' A, 'A' B FROM DUAL UNION ALL 
    SELECT 'B01' CD, 'AA' A, 'A' B FROM DUAL UNION ALL 
    SELECT 'B01' CD, 'BB' A, 'C' B FROM DUAL UNION ALL 
    SELECT 'B01' CD, 'BB' A, 'D' B FROM DUAL UNION ALL 
    SELECT 'B01' CD, 'BB' A, 'D' B FROM DUAL UNION ALL 
    SELECT 'B01' CD, 'BB' A, 'D' B FROM DUAL UNION ALL 
    SELECT 'B01' CD, 'BB' A, 'D' B FROM DUAL UNION ALL 
    SELECT 'B01' CD, 'BB' A, 'D' B FROM DUAL UNION ALL 
    SELECT 'B01' CD, 'CC' A, 'A' B FROM DUAL UNION ALL 
    SELECT 'B01' CD, 'CC' A, 'A' B FROM DUAL UNION ALL 
    SELECT 'B01' CD, 'CC' A, 'B' B FROM DUAL UNION ALL 
    SELECT 'B01' CD, 'DD' A, 'B' B FROM DUAL UNION ALL 
    SELECT 'B01' CD, 'DD' A, 'C' B FROM DUAL UNION ALL 
    SELECT 'B01' CD, 'DD' A, 'D' B FROM DUAL UNION ALL 
    SELECT 'B01' CD, 'DD' A, 'A' B FROM DUAL UNION ALL 
    SELECT 'B01' CD, 'DD' A, 'A' B FROM DUAL UNION ALL 
    SELECT 'B01' CD, 'DD' A, 'B' B FROM DUAL UNION ALL 
    SELECT 'B01' CD, 'DD' A, 'B' B FROM DUAL UNION ALL 
    SELECT 'B01' CD, 'DD' A, 'C' B FROM DUAL UNION ALL 
    SELECT 'B01' CD, 'DD' A, 'D' B FROM DUAL UNION ALL 
    SELECT 'B01' CD, 'EE' A, 'D' B FROM DUAL UNION ALL 
    SELECT 'B01' CD, 'EE' A, 'A' B FROM DUAL 
    ) 
    SELECT CD, 
    CASE WHEN GROUPING(RN) !=0 THEN '합계' 
    ELSE CASE WHEN RN > 3 THEN '기타' 
    ELSE TO_CHAR(MAX(NO)) 
    END 
    END NO, 
    CASE WHEN GROUPING(RN) = 0 AND RN <= 3 
    THEN MAX(A) 
    END A, 
    CASE WHEN GROUPING(RN) = 0 AND RN <= 3 
    THEN MAX(B) 
    END B, 
    SUM(CNT) CNT, 
    TO_CHAR(SUM(RT)*100,'FM990.00')||'%' RT 
    FROM ( 
    SELECT CD, 
    A, 
    B, 
    COUNT(*) CNT, 
    RANK() OVER (PARTITION BY CD ORDER BY COUNT(A||B) DESC) NO, 
    CASE WHEN ROW_NUMBER() OVER (PARTITION BY CD ORDER BY COUNT(A||B) DESC,B) > 3 THEN 4
    ELSE ROW_NUMBER() OVER (PARTITION BY CD ORDER BY COUNT(A||B) DESC,B) END RN, 
    RATIO_TO_REPORT(COUNT(*)) OVER (PARTITION BY CD) RT 
    FROM T 
    GROUP BY CD,A,B 
    ) 
    GROUP BY CD,ROLLUP(RN)

블로그 이미지

요다할아범

,

%userprofile%\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch

블로그 이미지

요다할아범

,

Critical Section - Windows vs Linux in C++

Just to provide a simple equivalent critical section code between Windows and Linux

For Windows, critical section code are located at WinBase.h. Normally, you do not need to include this header as it is pre-loading in VS compiler

For Linux, mutex code are located in pthread.h. You will have to include this header file in order to use mutex in Linux

Creating critical section variable

This variable will be the object to be acquired when you want to use any critical resource

On Windows

CRITICAL_SECTION cs;

On Linux

pthread_mutex_t m;


Initializing critical section

You have to initialize the critical section resource before using

On Windows

InitializeCriticalSection(&cs);

On Linux

//create mutex attribute variable
pthread_mutexattr_t mAttr;

// setup recursive mutex for mutex attribute
pthread_mutexattr_settype(&mAttr, PTHREAD_MUTEX_RECURSIVE_NP);

// Use the mutex attribute to create the mutex
pthread_mutex_init(&m, &mAttr);

// Mutex attribute can be destroy after initializing the mutex variable
pthread_mutexattr_destroy(&mAttr)


Enter and Leave critical section

They always use in a pair. Critical resource should be placed within the critical section

Windows

EnterCriticalSection(&cs);

LeaveCriticalSection(&cs);


Linux

pthread_mutex_lock (&m);


pthread_mutex_unlock (&m);

Destroy critical section

You have to release the critical section when it is no long required

On Windows

DeleteCriticalSection(&cs);

On Linux

pthread_mutex_destroy (&m);
블로그 이미지

요다할아범

,

# Administrator 계정 사용하기
- 컴퓨터 -> 관리 -> 로컬 사용자 및 그룹 -> 사용자 -> Administrator 속성
- 계정 사용 안 함 체크해제
- Administrator로 로그인
- 명령어
: net user Administrator /active:yes
: shutdown -l

# 임시 계정삭제
- 제어판 -> 모든 제어판 항목 -> 사용자 계정 -> 다른 계정 관리 -> 임시 계정 -> 삭제
- 명령어
: net user UserAccount /delete
: rd C:\Users\UserAccount /s /q

# 자동 로그인 설정
- netplwiz

# 최대 절전 모드 끄기
- powercfg -h off

# 멀티코어 부팅
- msconfig -> 부팅 -> 고급 옵션 -> 프로세서 수 체크 -> 2로 변경
- 모든 부팅설정을 영구히 유지 체크

# 자동실행 끄기
- 제어판 -> 모든 제어판 항목 -> 자동 실행 -> 모든 미디어 및 장치에 자동 실행 사용 체크 해제

# 디펜더 기능 끄기
- 제어판 -> 모든 제어판 항목 -> 관리 도구 -> 서비스 -> Windows Defender 사용 안함으로 변경

# 알림 메시지 끄기
- 제어판 -> 모든 제어판 항목 -> 관리 센터 -> 관리 센터 설정 변경
- 모든 메시지 체크 해제

# 키보드 반응속도 높이기
- control keyboard

# 쓸데 없는 Windows 기능 제거
- 제어판 -> 모든 제어판 항목 -> 프로그램 및 기능 -> Windows 기능 사용/사용안함
- IE8, Windows Search를 제외한 모두 제거

# 바탕 화면 아이콘 제거
- 개인 설정 -> 바탕 화면 아이콘 설정
- 모든 아이콘 체크 해제

# 시각 효과 제거
- 바탕 화면 구성 사용
- 창 및 단추에 시각 스타일 사용
- 투명 효과 사용
- 화면 글꼴의 가장 자리 다듬기

# 탐색기 내컴퓨터로 기본 열기
- %windir%\explorer.exe /n,

# 가상 메모리 제거
- 모든 드라이브에 대한 페이지 파일 크기 자동 관리 체크 해제
- 페이징 파일 없음 선택
- HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management
- DisablePagingExecutive 1

# IPv6 비활성
- HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\TCPIP6\Parameters
- 새로운 키 DWORD(32) Value
- DisabledComponents ffffffff

# 시스템 보호 해제

# 원격 지원 체크 해제

# 조각 모금 예약실행 해제

# 익스플로러 설정
- inetcpl.cpl
- 일반
: 탭 설정의 팝업 표시 방법 IE에서 자동으로 결정으로 선택
- 개인 정보
: InPrivate 관련 모두 체크
- 내용
: 자동완성 -> 검색 기록만 체크
: 피드 및 웹 조각 -> 모두 체크 해제
- 연결
: LAN 설정
: 자동으로 설정 검색 체크 해제
- 고급
: 프록시 연결을 통해 HTTP 1.1 사용 체크 해제
: 부드러운 화면 이동 체크 해제
: UTF-8 URL 보내기 체크 해제
: SmartScreen 필터 사용 체크 해제


# 작업 표시줄 설정
- 작은 아이콘 사용
- 작업 표시줄 단추 : 단추 하나로 표시 안함
- 알림 영역 : 작업 표시줄에 항상 모든 아이콘 및 알림 표시
- 시작 메뉴 탭 -> 개인 정보의 모든 항목 체크 해제

# 서비스 정지
- Base Filtering Engine
- Certificate Propagation
- COM+ Event System
- Cryptographic Services
- Diagnostic Policy Service
- Diagnostic Service Host
- Diagnostic System Host
- Distributed Link Tracking Client
- DNS Client
- Human Interface Device Access
- IP Helper
- Offline Files
- TCP/IP NetBIOS Helper
- Windows Defender
- WinHTTP Web Proxy Auto-Discovery Service

# 서비스 설명
[중지 할 수 없는 서비스]
- DCOM Server Process Launcher
- Group Policy Client
- Remote Procedure Call (RPC)
- RPC Endpoint Mapper
- Task Scheduler

[시스템 안전성 서비스]
- Plug and Play
- User Profile Service
- Power
- Windows Event Log
- Windows Management Instrumentation
- Workstation

[Aero 테마 관련 서비스]
- Desktop Window Manager Session Manager
- Themes

[인터넷 관련 서비스]
- DHCP Client
- Network Connections
- Network Store Interface Service

[터미널 관련 서비스]
- Remote Desktop Services
- Remote Desktop Services UserMode Port Redirector

[사운드 관련 서비스]
- Multimedia Class Scheduler
- Windows Audio
- Windows Audio Endpoint Builder

[프린터 관련 서비스]
- Print Spooler

블로그 이미지

요다할아범

,

오라클 테이블을 생성 할 때 각 컬럼에 지정 할 수 있는 데이터 타입들 입니다.

DATA TYPE

설 명

VARCHAR2(n)

가변 길이 문자 데이터(1~4000byte)

CHAR(n)

고정 길이 문자 데이터(1~2000byte)

NUMBER(p,s)

전체 p자리 중 소수점 이하 s자리(p:1~38, s:-84~127)

DATE

7Byte(BC 4712년 1월 1일부터 AD 9999년 12월 31일)

LONG

가변 길이 문자 데이터(1~2Gbyte)

CLOB

단일 바이트 가변 길이 문자 데이터(1~4Gbyte)

RAW(n)

n Byte의 원시 이진 데이터(1~2000)

LONG RAW

가변 길이 원시 이진 데이터(1~2Gbyte)

BLOB

가변 길이 이진 데이터(1~4Gbyte)

BFILE

가변 길이 외부 파일에 저장된 이진 데이터(1~4Gbyte)



문자 데이터(Character Data)


- 문자 데이터는 데이터베이스에 고정 길이, 또는 가변 길이 문자열로 저장될 수 있습니다.

- CHAR와 NCHAR같은 고정 길이 문자 데이터 유형은 고정 길이까지 공백으로 채워서 저장합니다.

- NCHAR는 고정 폭(fixed-width), 또는 가변 폭(variable-width) character set의 저장을
가능하게 하는 NLS 데이터 유형입니다.
최대 크기는 한 문자를 저장하는데 필요한 바이트 수에 따라 결정되며 한 행 당 2000 바이트가 상한입니다.
기본값은 charater set에 따라 1 문자, 또는 1 바이트입니다.

- 가변 길이 문자 데이터 유형은 실제 컬럼 값을 저장하는데 필요한 바이트만큼만을 사용하며
각 행에 따라 그 크기가 다양합니다.
VARCHAR2와 NVARCHAR2 가 있습니다.


숫자 데이터(Numeric Data)

- 오라클 데이터베이스에서 숫자는 항상 가변 길이 데이터로 저장되며 유효 자릿수 38자리까지
저장할 수 있습니다.



날짜(DATE) 데이터 유형


- 오라클 서버는 날짜를 7 바이트, 고정 길이 필드(field)로 저장합니다.

- 오라클 DATE는 항상 시간을 포함합니다.



RAW 데이터 유형


- 크기가 적은 이진 데이터의 저장에 사용 합니다.



크기가 큰 오브젝트를 저장하기 위한 데이터 유형


크기가 큰 오브젝트를 저장하기 위한 데이터 유형에는 LONG과 LONG RAW, LOB데이터 유형이 있습니다.

LONG데이터 유형은 2GB의 문자열 데이터를 저장 할 수 있습니다.

③ 오라클은 LOB을 저장하기 위한 여섯 가지 데이터 유형을 제공합니다.

- 큰 고정 폭(fixed-width) 문자 데이터를 위한 CLOB과 LONG
- 큰 고정 폭 국가 character set 데이터를 위한 NCLOB
- 구조화되지 않은 데이터를 저장하기 위한 BLOB과 LONG RAW
- 구조화되지 않은 데이터를 운영 체제 파일에 저장하기 위한 BFILE


④ LONG과 LOB 데이터 유형 비교

LONG, LONG RAW

LOB

테이블에 컬럼 하나만 생성 할 수 있음

테이블에 여러개의 컬럼 생성이 가능

2GB

4GB

SELECT결과로 데이터를 리턴

SELECT결과로 위치를 리턴

데이터를 직접 저장

데이터를 직접 또는 간접 저장

오브젝트 유형을 지원하지 않음

오브젝트 유형 지원


블로그 이미지

요다할아범

,