2012-07-06 51 views
0

我将数据选择到临时表中,然后查询该表以获取报表的其他值。这里是产生错误的代码,如果它有什么区别,临时表中就有大约3600万条记录。它表示错误出现在第一个查询的第一列。将表达式转换为数据类型的算术溢出错误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 2012-07-06 18:19:11

+0

@wallyk - 这是我对这个错误感到困惑的部分。我看不出为什么它会将任何东西转换为int,特别是在该列上。 – RageQwit 2012-07-06 18:20:05

+0

让我们看看'create table#temp1'的语句和错误消息。 – wallyk 2012-07-06 18:21:27

回答

0

是否有可能你的JOIN_DTM有一个无效日期(outwith范围或空),则DATEDIFF运行在它身上,将其转换成int和导致错误?

1

嗯,订阅别名在一个拥有3400万行的表中需要5个左右的不同值。那么其中之一将会有至少600万行。自连接将产生至少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

最终结果应该是一个3列表,列表名称,列表的总体成员数以及最近30天内加入的成员数。我很确定你指出的查询是我想要的正确的东西。 – RageQwit 2012-07-06 18:42:39

+0

你可以问另外一个问题,我们可以帮助你创建正确的查询吗? – 2012-07-06 18:44:10

+0

有没有办法在单个查询中完成我想要做的事情而不是使用联合?如果我要使用子查询来填充其中一个计算列的值,该怎么办? – RageQwit 2012-07-06 19:03:29

相关问题