SQL - 使用CASE转换STR后表示SUM - > INT

时间:2016-07-26 19:41:17

标签: sql rtc ibm-jazz

我很抱歉提前发帖可能很长。

背景
我正在使用Rational Team Concert(RTC)将工作项数据与Jazz Reporting Service一起存储以创建报告。使用报表生成器工具,它允许您编写自己的查询以将数据作为表提取,并具有自己的接口以表格形式表示。

图表的选择不多;图表类型默认为计数,除非您指定它以显示总和。为了按总和绘制图形,数据必须是数字而不是字符串。默认情况下,报表生成器假定SELECT语句中的所有变量都是字符串。

我将使用的数据是一堆工作项。每个工作项与团队(A,B)相关联,并具有工作估计编号(count1,count2)。

Item # | Team | Work   |
------------------------
123    |  A   | count1 |
------------------------
124    |  A   | count2 |
------------------------
125    |  B   | count2 |
------------------------
....

问题
由于工作估计作为标签输入,因此第一步是在使用SELECT转换count1时使用CATCH WHEN块 - > 1,和count2 - > 2(字符串标记为可以求和的实际数字)。这导致一个数字1和2的表代替了类型化的标签(目前为止很好)。

Item # | Team | Work   |
------------------------
123    |  A   |   1    |
------------------------
124    |  A   |   2    |
------------------------
125    |  B   |   2    |
------------------------
....

问题是我试图用sum绘图,这意味着让工具将SELECT语句中的变量标识为数字,除了某些原因我在SELECT语句中声明的任何变量总是被视为一个字符串(该工具有一个当前列的表,即SELECT中的变量,以及该工具标识为其变量类型。)

尝试解决方案
我做的第一个查询是返回每个工作项的表及其团队名称和工作估算值

SELECT T1.NAME,
       (CASE WHEN T1.TAGs='count1' THEN 1 ELSE 2 END) AS WORK
FROM RIDW.VW_REQUEST T1
WHERE T1.PROJECT_ID = 73

导致了

 Team | Work   |
----------------
 A    |   1    |
----------------
 A    |   2    |
----------------
 B    |   2    |
----------------
....

但该工具仍将数字视为字符串。然后我尝试将CASE明确地转换为整数,但导致了相同的问题

...
CAST(CASE WHEN T1.TAGs='count1' THEN 1 ELSE 2 END AS Integer) AS WORK
...

该工具仍然表示为字符串。

当前目标
因为我无法确认该工具是否存在潜在问题,查询的兼容性问题等。我认为现在可以使用的是返回一个包含2行的表:每个团队的工作总和

       |Sum of 1's and 2's  |
-----------------------------
Team A |  SUM(1) + SUM(2)   |
-----------------------------
Team B |  SUM(1) + SUM(2)   |
-----------------------------

我遇到的问题是使用子查询来使用SUM来对数据求和。当我尝试     SUM(CASE WHEN ... END) AS TIME2我收到一个错误“列修饰符AVG和SUM仅适用于数字属性”。这让我觉得我需要有一个子查询返回CASE之后的列,然后SUM,但我正在进入未知的水域,似乎无法使语法工作。

据我所知,这样的帖子在产品帮助论坛上会更好。我试过四处询问但无法得到任何帮助。我建议返回2行/列表的解决方案应该绕过软件可能遇到的任何问题,但是在使用案例时我需要帮助查询SUM。

感谢您的时间和帮助!

编辑1
下面是完整的查询代码,它可以正确地执行CASE,但仍然由工具引入解释类型:

SELECT  
   T1.Name,
   CAST(CASE WHEN T1.TAGS='|release_points_1|' THEN 1 ELSE (CASE WHEN T1.TAGS='|release_points_2|' THEN 2 ELSE 0 END) END AS Integer) AS TAG,
FROM RIDW.VW_REQUEST T1
WHERE T1.PROJECT_ID = 73 
AND
(T1.ISSOFTDELETED = 0) AND
(T1.REQUEST_ID <> -1 AND T1.REQUEST_ID IS NOT NULL

1 个答案:

答案 0 :(得分:1)

对当前查询的这种小调整应该有效:

SELECT  
   T1.Name,
   SUM(CAST(CASE WHEN T1.TAGS='|release_points_1|' THEN 1 ELSE (CASE WHEN T1.TAGS='|release_points_2|' THEN 2 ELSE 0 END) END AS Integer)) AS TAG,
FROM RIDW.VW_REQUEST T1
WHERE T1.PROJECT_ID = 73 
AND
(T1.ISSOFTDELETED = 0) AND
(T1.REQUEST_ID <> -1 AND T1.REQUEST_ID IS NOT NULL
GROUP BY T1.Name