2014-12-06 58 views
1

我在我的數據庫中有兩個表。其中一個具有郵政編碼位置的裝運數據,另一個表具有美國所有拉鍊的完整郵政編碼列表。我只是在下面列出了相關的專欄,以保持簡單。SQL Server的int轉換忽略子查詢?

表:郵編

  • 郵編PK炭(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

治療郵政編碼爲整數不僅是加拿大的代碼,而且美國郵政編碼已經領先0問題需要採取真的很難看這一要求,因爲它是如此困難。例如。將所有情況下,將int前導零零郵政編碼轉換爲5個字符串...爲什麼將郵政編碼視爲int?你不能用它做數學。 – 2014-12-06 17:27:21

+0

那麼我需要它與文件和Excel之間的一些數據工作,煩人的是,無論我保存爲CSV時做什麼,總是刪除前導0。所以我試圖通過將其輸出爲整數來節省額外的步驟。 – ElPresidente 2014-12-06 17:55:05

回答

1

問題是執行計劃,我不確定你可以強制子查詢運行1st。

您可以做到這一點,並防止必須對CAS進行CAS。

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