我似乎无法让我的总计正确计算

时间:2011-11-22 03:00:26

标签: sql sql-server sql-server-2005 tsql

当我在下面运行此查询时,

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())

我得到了正确的结果。

这是正确的结果,因为当db上的值为'-1'时,ccode显示'未显示'

但是,当我执行UNION ALL时,我可以得到每列的总数,我得到结果但是当ccode的valye为'-1'时,'不显示'不再可见。

有超过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

2 个答案:

答案 0 :(得分:0)

这是因为UNION ALL查询中的每个SQL语句必须在具有相似数据类型的结果集中具有相同数量的字段。引用自MSDN:

  

以下是组合两个结果集的基本规则   使用UNION进行查询:

     
      
  • 所有查询中列的数量和顺序必须相同。
  •   
  • 数据类型必须兼容
  •   

现在,您的'未显示'输出会更改列数据类型。尝试在两个查询中创建一个伪列并使用两列输出,否则,在未找到大小写时将输出作为数值。

编辑:ccode是nvarchar(50)类型。但是当您输出“未显示”时,它是文本类型,并且会出现数据类型不匹配的情况。有人可能想知道nvarchar应该能够处理文本,但从技术上讲,它是一种数据类型不匹配,它会产生这样的运行时问题。或者根据我的理解,至少这是我所知道的。

答案 1 :(得分:0)

我弄明白了这个问题。工会实际上工作了。唯一的问题是我正在查询错误的表,它没有任何值'-1'。

所以,基本上,我是对的,因为UNION与查询无效的原因无关。如果我有使用CASE语句的值,它会起作用。