2013-02-25 2 views
1

우리 데이터베이스에는 다음 행을 따라 십진수 형식을 사용하는 테이블이 있습니다. yyyymmdd, 모두 하나의 큰 십진수 (즉, 오늘은 20130225)입니다. 월별 버킷으로 다시 가져 오는 SQL 쿼리를 만들려고합니다. 내 연구에서 가장 좋은 방법은 숫자를 100으로 나누어 맨 오른쪽에있는 날을 잘라내는 것입니다 (나머지는 제거하면 20130225/100은 201302와 같습니다)"SELECT 목록의 표현식이 유효하지 않습니다."

나는 알아낼 수 없습니다. 어떻게 작동하게하는지. 내 선택과 그룹화 모두에서 (INVOICE_DATE/100) As "INVOICE_MONTH"과 같은 것을 사용하기 시작했습니다. 그게 작동하지 않았을 때 그룹을 "INVOICE_MONTH"으로, 그 다음에 (INVOICE_DATE/100)으로 줄였습니다. 그래서 선택과 그룹을 단지 INVOICE_DATE/100으로 줄였습니다. 여전히 작동하지 않는 것 같습니다.

여기에 (몇 작은 redactions와) 전류에서 내 코드 내 어디 문이뿐만 아니라 문제를 일으키는 경우 내가 도움이되지만 궁금 수

Select Count(COMPETITOR_NAME) as "STORE COUNT", 
    COMPETITOR_NAME, 
    INVOICE_DATE/100, 
    CUSTOMER_NUMBER, 
    OVERRIDE_TYPE, 
    Sum (QTY_SOLD) as "Quantity Sold", 
    Sum (EXT_ORIGINAL_PRICE) as "Sum Original Price", 
    Sum (EXT_OVERRIDE_PRICE) as "Sum Override Price", 
    Sum (EXT_VARIANCE) As "Sum Variance", 
    Sum (INTERNAL_COST) as "Internal Cost" 
From DA*****.DW*******.PRCOVRWK 
Where INVOICE_DATE/100 between 201002 and 201302 
Group By ROLLUP(COMPETITOR_NAME, 
    INVOICE_DATE/100), 
    OVERRIDE_TYPE, 
    CUSTOMER_NUMBER 
Order By OVERRIDE_TYPE, 
    COMPETITOR_NAME, 
    INVOICE_DATE, 
    CUSTOMER_NUMBER 

입니다. 처음에는 Where INVOICE_DATE between 20100225 and 20130225을 사용하고 있었지만 Select 문과 같은 것을 사용해야 할 필요가있을 것이라고 생각했습니다. (예, 지금이 시점에서 다소 늘고 있습니다.) IBM 웹 사이트의 문서를 따르기 위해 최선을 다했지만 기대했던대로 작동하지 않는 것으로 잘못 읽고 있어야합니다.

아무튼. 기본적인 필요 사항은 월간 버킷으로 정보를 다시 가져올 수 있어야합니다. 그래서, 당신이 다른 접근법을 안다면 받아 들일 수 있습니다. 내 희망은 단지 십진수 나누기를 사용하여 연도/날짜 콤보를 가져 와서 Group By에서 필요한 결과를 얻는 것입니다.

PS- 우리는 i5 용 DB2 v5.1을 사용하고 있습니다.

+0

'month (Invoice_Date)'는 월을 추출하지 않습니까? 그렇지 않다면 필드에 대한 데이터 유형을 확인할 수 있습니까? – xQbert

+0

선택 목록에있는 어떤 표현이 불평입니까? (작동 될 때까지 하나씩 제거하십시오.) –

+0

@xQbert 날짜는 10 진수로 표시됩니다. 10 진수로 날짜 산술을 사용할 수 없다고 생각 했나요? –

답변

0

실제로 대답은 상당히 간단합니다. 문제는 내가 Order By에 제대로 나열된 부서를 갖고 있지 않다는 것입니다. 그것은 중요하게 여겨 져야하는 것처럼 보이지는 않습니다.하지만 일단 그렇게하면 모든 것이 효과가 있습니다.

나는 소수 응답으로 끝냈다. 그래도 잘 돌아 간 것 같은 반올림을 사용하여 문제를 해결하기로 결정했습니다.

Select Count(COMPETITOR_NAME) as "STORE COUNT", 
    COMPETITOR_NAME, 
    ROUND(INVOICE_DATE/100, 0) As "Month_Date", 
    CUSTOMER_NUMBER, 
    OVERRIDE_TYPE, 
    Sum (QTY_SOLD) as "Quantity Sold", 
    Sum (EXT_ORIGINAL_PRICE) as "Sum Original Price", 
    Sum (EXT_OVERRIDE_PRICE) as "Sum Override Price", 
    Sum (EXT_VARIANCE) As "Sum Variance", 
    Sum (INTERNAL_COST) as "Internal Cost" 
From DA******.DW*******.PRCOVRWK 
Where INVOICE_DATE > 20100201 
Group By COMPETITOR_NAME, 
    ROUND(INVOICE_DATE/100, 0), 
    OVERRIDE_TYPE, 
    CUSTOMER_NUMBER 
Order By COMPETITOR_NAME, 
    ROUND(INVOICE_DATE/100, 0), 
    SUM (EXT_VARIANCE), 
    CUSTOMER_NUMBER 

그래서, 그래, 그것은 보일 수도 같은 바보, DB2 V5,1 그냥 정말 Select, Group ByOrder By 사이의 문 일치를 만들기 위해 저를 원 : 여기에 내가 호기심에와 종료 코드입니다. 글쎄, 거의 같은, 당신 Select에서 As 사용할 수 있지만 다른 곳에서는 없습니다.

이렇게하면 비슷한 문제가있는 다른 사용자에게 도움이되기를 바랍니다.

0

문제는 롤업 구문이라고 생각합니다. documentation을 확인하십시오. . . 표현 group by rollup은 모든 열에 대해서만 작동합니다. 따라서 이것을 시도하십시오 :

Group By ROLLUP (COMPETITOR_NAME, 
    INVOICE_DATE/100, 
    OVERRIDE_TYPE, 
    CUSTOMER_NUMBER) 

또는 다른 조합에 대해 그룹화 집합을 사용하십시오.

또한 정수 나누기를 명시 적으로 사용하는 것이 좋습니다. 그래서, idiv\ 교체 :

invoice_date idiv 100 
+0

롤업이 아니기 때문에 확실하다. 부서에 추가되었습니다. 게다가, 방금 롤업을 옮겨서 해결하지 못했습니다. 그래서 ... idiv를 사용할 때'100' toke가 유효하지 않다는 말을 듣고 있습니다. ', FROM INTO'가 기대됩니다. –

1

진수 날짜가 될 필요 이상으로 우리의 삶을 더 어렵게 만든다. Alan Campin's IDate functions을 사용 하시겠습니까? 이러한 소수 자릿수를 SQL 날짜 데이터 형식으로 쉽게 변환 할 수 있습니다. 일단 그렇게하면 연, 월을 추출하고 GROUP BY를 수행 할 수 있습니다.

V5R1에 실제로 있습니까? 나는 ROLLUP이 그 일찍 일했다고 생각하지 않았다 ...

+0

롤, 그래, 내게 달린다면 ... 나는 우리가 6,1을 가지고 있다는 말을 계속 들었다. 그러나 모든 나의 실수는 5,1을 말한다. 그리고 네, 롤업이 작동합니다. 또한 10 진수 날짜는 우리 존재의 단점이지만, 날짜 형식을 변경할 수있는 능력이 없습니다. 이 모든 결정은 내 손이 아닙니다. 그래도 고마워 :-). –

+0

당신은 데이터베이스를 전혀 변경하지 않을 것이고, SQL 문장 내에서 사용하기 위해 십진수 '날짜'를 실제 SQL 날짜로 변환하는 SQL 사용자 정의 함수 (SQL User Defined Functions) 세트가있을 것입니다. –

+0

나는 더 명백했을 것입니다. 이 서버에 대한 읽기 액세스 권한 만 있습니다. iDates 문서는 iSeries에 파일을 저장해야한다고 말합니다. 내 편이 이런 종류의 일을 할 수있는 방법이 있을까요? –

1

십진법을 날짜로 변환 해보십시오.

select digits(date), 
    year(date(
    substr(digits(date),1,4) concat 
    ''-'' concat 
    substr(digits(date),5,2) concat 
    ''-'' concat substr(digits(date),7,2))) as year, 
    month(date(
    substr(digits(date),1,4) concat 
    ''-'' concat 
    substr(digits(date),5,2) concat 
    ''-'' concat substr(digits(date),7,2))) as month 
from .... 

여기서 중요한 것은 문자로 변환 한 다음 부분 문자열을 입력하고 적절한 날짜 구분 기호를 삽입하는 것입니다.

그런 다음 다시 GROUP BY를 수행하십시오. 그것은 가장 끔찍한 SQL 문장이 될 것이지만 모든 클라이언트 측이 될 것입니다.

+0

지속성을위한 Upvoting. 나는 이것이 작동한다는 것을 스스로 증명할 인내심이 없지만,이 선을 따라 무언가가 어떻게 든 작동한다고 가정 할 것이다.OP의 상황을 감안할 때 그는 뭔가를 찾고 있다고 말했습니다. –

1

어두운 곳에서 촬영 : INT을 사용해 데이터를 정수로 만들려고 했습니까? INT(INVOICE_DATE/100)에서와 같이?

기타 "맞춤법"은 INTEGER(INVOICE_DATE/100) 또는 CAST(INVOICE_DATE/100 AS INTEGER) 일 수 있습니다.

관련 문제