2011-11-22 13 views
0

計算,我似乎無法得到當我運行下面這個查詢我的總計正確

SELECT clientid, 
     CASE WHEN D.ccode = '-1' Then 'Did Not Show' ELSE D.ccode End ccode, 
     ca, 
     ot, 
     bw, 
     cshT, 
     dc, 
     dte, 
     approv 
    FROM dbo.emC D 
WHERE year(dte) = year(getdate()) 

我得到正確的結果。

這是正確的結果,因爲CCODE顯示「沒有顯示」時的分貝值是「-1」

然而,當我做了UNION ALL這樣我就可以得到總爲每列,我得到當valcode for ccode爲'-1'時,結果但'Did Not Show'不再顯示。

有超過1000條值爲'-1'的記錄。

有人可以幫忙嗎?

以下是帶UNION的完整代碼。

SELECT clientid, 
CASE WHEN D.ccode = '-1' Then 'Did Not Show' ELSE D.ccode End ccode, 
ca, 
ot, 
bw, 
cshT, 
dc, 
dte, 
approv 
FROM dbo.emC D WhERE year(dte) = year(getdate()) 
UNION ALL 
SELECT 'Total', 
'', 
SUM(D.ca), 
SUM(D.ot), 
SUM(D.bw), 
SUM(D.cshT), 
'', 
'', 
'' 
    FROM emC D 
WHERE YEAR(dte)='2011' 

我也使用ROLLUP嘗試,但這裏真正的問題是,我不能讓「沒有表現出」要顯示的文字時CCODE值爲-1

ClientID  CCODE   ot  ca  bw  cshT 
019692 CF001   0.00 0.00 1.00 0.00 0.00 
019692 CH503   0.00 0.00 1.00 0.00 0.00 
010487 AC407   0.00 0.00 1.00 0.00 0.00 
028108 CH540   0.00 0.00 1.00 0.00 0.00 
028108 GS925   0.00 0.00 1.00 0.00 0.00 
001038 AC428   0.00 0.00 3.00 0.00 0.00 
028561 Did Not Show  0.00 0.00 0.00 0.00 0.00 
016884 Did Not Show  0.00 0.00 0.00 0.00 0.00 
05184 CF001   0.00 0.00 4.50 0.00 0.00 

回答

0

我想出了問題。工會實際上工作。唯一的問題是我查詢的是沒有'-1'值的錯誤表。

所以,從本質上來說,我認爲UNION與查詢無法正常工作無關。如果我有我使用CASE聲明的價值,它會奏效。

0

這是因爲, UNION ALL查詢中的每個SQL語句在具有相似數據類型的結果集中必須具有相同數量的字段。從MSDN引用:

以下是通過使用UNION結果組的兩個 查詢相結合的基本規則:

  • 數和列的順序必須在所有查詢相同。
  • 的數據類型必須兼容現在

,你的「並沒有表現出」輸出,更改列的數據類型。嘗試在兩個查詢中創建一個僞列,並且有兩列輸出,否則,在未找到作爲數值的情況下輸出。

編輯:ccode是nvarchar(50)類型。但是,當您輸出「未顯示」時,它是文本類型,並且會出現數據類型不匹配。有人可能會想知道nvarchar應該能夠處理文本,但從技術上講它是一種數據類型不匹配,並且會產生這樣的運行時問題。或至少這是我根據我的理解知道的..

+0

儘管數據類型沒有改變。 ccode是nvarchar(50)。也許,我誤解了你的觀點。一個例子會很棒。感謝您的時間和幫助。 – Kenny

+0

請註明兩個查詢將輸出的列的確切列列結構。 – darnir

+0

我已經用樣本佈局更新了上面的帖子。對不起,他們向左轉。非常感謝你。我真的很感謝你的幫助。 – Kenny

相關問題