2011-11-22 14 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

相关问题