SQL Server int 转换忽略子查询?
Posted
技术标签:
【中文标题】SQL Server int 转换忽略子查询?【英文标题】:SQL Server int conversion ignores subquery? 【发布时间】:2014-12-06 17:20:27 【问题描述】:我的数据库中有两个表。一个表包含带有邮政编码位置的货运数据,另一个表包含美国所有邮政编码的完整邮政编码列表。为了简单起见,我只是在下面包含了相关的列。
表格:邮政编码
邮政编码 PK char(5)表格:出货量
ShipToZip varchar(10) AMT 十进制 (10,2)因此,有些货件数据可能发往非美国地址,而其他货件数据可能包括美国邮政编码 (XXXXX-XXXX) 的 +4,这就是货件表最多有 10 个的原因。我需要做的就是将查询导出为 CSV,但是我需要将邮政编码转换为整数。
SELECT CAST(ShipToZIP AS INT) AS [target],SUM(cast(AMT as int)) AS [total]
FROM
(SELECT LEFT(ShiptoZip,5) ShipToZip,Amt
FROM Shipments
WHERE LEFT(SHIPTOZIP,5) IN (SELECT zipcode from ZipCodeLocations)
) Q
GROUP BY CAST(ShipToZIP AS INT)
但是,当我运行该查询时,我不断收到加拿大邮政编码的转换错误。如果我自己运行内部 Q 查询,则每条记录都是仅适用于美国的有效代码。
如何强制子查询先运行?我尝试将其设为 this post 的 CTE,但它也不起作用。
【问题讨论】:
将邮政编码视为整数不仅对加拿大的邮政编码,而且对具有前导 0 的美国邮政编码也是一个问题。您需要认真研究该要求,因为它非常有问题。例如。将前导零邮政编码从 int 转换为 5 char 字符串的所有情况... 为什么将邮政编码视为 int?你不能用它做数学。 嗯,我需要它处理文件和 Excel 之间的一些数据,烦人的是,无论我保存为 CSV 时做什么,总是删除前导 0。所以我试图通过将其输出为整数来节省额外的步骤。 【参考方案1】:问题在于执行计划,我不确定您是否可以强制子查询首先运行。
您可以这样做并避免强制转换为 INT。
SELECT CASE ShiptoZip WHEN LEFT(ShiptoZip) = '0' THEN RIGHT(ShiptoZip, LEN(ShiptoZip) - 1) ELSE ShiptoZip END AS [target],
SUM(cast(AMT as int)) AS [total]
FROM
(SELECT LEFT(ShiptoZip,5) ShipToZip,Amt
FROM Shipments
WHERE LEFT(SHIPTOZIP,5) IN (SELECT zipcode from ZipCodeLocations)
) Q
GROUP BY CASE ShiptoZip WHEN LEFT(ShiptoZip) = '0' THEN RIGHT(ShiptoZip, LEN(ShiptoZip) - 1) ELSE ShiptoZip END
如果您必须走那条路线,您的另一种选择是在聚合后 CAST 到 INT。
SELECT CAST(ShipToZIP AS INT) AS [target],[total]
FROM
(SELECT LEFT(ShiptoZip,5) ShipToZip, SUM(cast(AMT as int)) AS [total]
FROM Shipments
WHERE LEFT(SHIPTOZIP,5) IN (SELECT zipcode from ZipCodeLocations)
GROUP BY ShipToZIP
) Q
【讨论】:
以上是关于SQL Server int 转换忽略子查询?的主要内容,如果未能解决你的问题,请参考以下文章