2012-07-06 6 views
0

임시 테이블에 데이터를 선택한 다음 해당 테이블을 쿼리하여 보고서의 다른 값을 가져옵니다. 다음은 오류를 생성하는 코드입니다. 차이가있을 경우 임시 테이블에 약 3 천 6 백만 개의 레코드가 있습니다. 오류가 첫 번째 쿼리의 첫 번째 열에 있음을 나타냅니다.산술 오버플로 오류 식을 데이터 유형 int로 변환

SELECT SUBSCRIPTION_ALIAS, 
     'Count' = 0, 
     COUNT(SUBSCRIPTION_ALIAS) AS MonthChange 
FROM #Temp1 A WHERE DATEDIFF(day,JOIN_DTM,'01/01/2012') < 31  
GROUP BY SUBSCRIPTION_ALIAS 

UNION 

SELECT B.SUBSCRIPTION_ALIAS, 
     COUNT(B.SBSCRPTN_MBR_KEY) AS [Count], 
     'MonthChange' = 0 
FROM #Temp1 B JOIN #Temp1 A ON B.SUBSCRIPTION_ALIAS = A.SUBSCRIPTION_ALIAS 
GROUP BY B.SUBSCRIPTION_ALIAS 

DROP TABLE #Temp1 

다음은 임시 테이블에 대한 설명입니다 (추한 것입니다). 오류 메시지는이 스레드의 제목입니다.

SELECT 
    bi_communications.F_EML_RCPNT.SBSCRPTN_LIST_KEY, 
    bi_communications.F_EML_RCPNT.SBSCRPTN_MBR_KEY, 
    bi_communications.D_SBSCRPTN_LIST.SBSCRPTN_LIST_NM, 
    bi_communications.F_EML_RCPNT.DLRY_DT_KEY, 
    bi_communications.D_DT.DT_DT, 

    CASE 
WHEN D_SBSCRPTN_LIST.SBSCRPTN_LIST_NM = 'active-offers' THEN 'Special Offers' 
WHEN D_SBSCRPTN_LIST.SBSCRPTN_LIST_NM = 'reserveamerica-offers' THEN 'RA Special Offers' 
WHEN D_SBSCRPTN_LIST.SBSCRPTN_LIST_NM in 
    ('active-team-sports-insider','active-tennis','active-women-news', ... (omitting excess) 
    ) THEN 'Content' 
    WHEN D_SBSCRPTN_LIST.SBSCRPTN_LIST_NM = 'local-events' THEN 'Local Events' 
    ELSE 'Blank' 
    END AS SUBSCRIPTION_ALIAS, 
    bi_communications.D_SBSCRPTN_MBR.JOIN_DTM 
INTO #Temp1  
FROM bi_communications.F_EML_RCPNT 
    JOIN 
    bi_communications.D_SBSCRPTN_LIST ON bi_communications.F_EML_RCPNT.SBSCRPTN_LIST_KEY = bi_communications.D_SBSCRPTN_LIST.SBSCRPTN_LIST_KEY 
JOIN bi_communications.D_DT ON bi_communications.F_EML_RCPNT.DLRY_DT_KEY = bi_communications.D_DT.DT_KEY 
    JOIN bi_communications.D_SBSCRPTN_MBR ON bi_communications.F_EML_RCPNT.SBSCRPTN_MBR_KEY = bi_communications.D_SBSCRPTN_MBR.SBSCRPTN_MBR_KEY 
WHERE 
    bi_communications.F_EML_RCPNT.SBSCRPTN_LIST_KEY IN 
    (180740437, 180741017, 180740482, 180740438, ...) 
AND bi_communications.D_DT.DT_DT BETWEEN '01/01/2011 00:00:00' AND '01/01/2012 00:00:00' 
+0

'int'로 변환되는 이유는 무엇입니까? 어쩌면 오류 메시지를 포함시켜야합니다. – wallyk

+0

@wallyk - 그게 내 오류에 대해 혼란 스럽네. 나는 그것이 무엇이 int로, 특히 그 컬럼으로 변환 될지 알 수 없다. – RageQwit

+0

'create table # temp1'과 에러 메시지에 대한 설명을 보겠습니다. – wallyk

답변

0

그것이 가능 당신의 JOIN_DTM (범위 또는 다만 널 outwith) 잘못된 날짜가 다음 DATEDIFF는 INT로 변환, onit 실행 오류의 원인은?

1

흠, 구독 별칭은 3 천 4 백만 행이있는 테이블에서 5 가지 정도의 다른 값을 취합니다. 음,이 중 하나는 최소 600 만 개의 행을 가질 것입니다. 자체 조인 (self join)은 적어도 36 조 행의 행을 생성하며 두 번째 쿼리에서 산술 오버플로에 빠르게 도달합니다.

정말요?

SELECT B.SUBSCRIPTION_ALIAS, COUNT(B.SBSCRPTN_MBR_KEY) AS [Count],'MonthChange' = 0 
FROM #Temp1 B JOIN #Temp1 A 
    ON B.SUBSCRIPTION_ALIAS = A.SUBSCRIPTION_ALIAS 
GROUP BY B.SUBSCRIPTION_ALIAS 

이것은 본질적으로 카운트의 행 수를 제곱하고 있습니다. 나는 그 오류가 두 번째 하위 쿼리에 있다고 추측 할 것이다. 위치가 올바르게보고되지 않습니다.

+0

최종 결과는 목록 이름, 목록의 전체 구성원 수 및 지난 30 일 동안 합류 한 구성원 수를 포함하는 3 열 테이블로 가정됩니다. 당신이 지적한 쿼리가 내가 원하는 것에 대한 올바른 것이라고 확신합니다. – RageQwit

+0

올바른 질문을 만들 수 있도록 다른 질문을 할 수 있습니까? –

+0

노조를 사용하는 대신 단일 쿼리에서 수행 할 작업이 있습니까? 하위 쿼리를 사용하여 계산 된 열 중 하나의 값을 채우려면 어떻게해야합니까? – RageQwit

관련 문제