2014-02-09 46 views
2

我想创建一个图表,用于从SQL数据库中生成的2个用户问题中提取数据。SQL - 2个表值按第三个未连接值分组

问题是用户问题与答案一样存储在同一个表中。唯一的连接是问题字符串包含年份值,我使用命令提取的年份值,以便输出一个名为'YEAR'的列,列中包含从2013年到2038年(25年期间)的整数值列表, 。 然后,我想从每个'YEAR'拉相应的答案('预测'和'实际'),以便我可以绘制一个图表与每年的几个值(抱歉,如果这没有任何意义)。图表应显示25年期间的预测线,第二行(或列)显示多年来人口填充时的实际值。然后我就能够想象,如果我们的实际值是接近我们原来的预测数字(长期目标!)

下面的代码

SELECT CAST((LEFT(F_TASK_ANS.TA_ANS_QUESTION,4)) AS INTEGER) AS YEAR, 
-- first select takes left 4 characters of question and outputs value as string then coverts value to whole number. 
CAST((CASE WHEN F_TASK_ANS.TA_ANS_QUESTION LIKE '%forecast' THEN F_TASK_ANS.TA_ANS_ANSWER END) AS NUMERIC(9,2)) AS 'FORECAST', 
CAST((CASE WHEN F_TASK_ANS.TA_ANS_QUESTION LIKE '%actual' THEN ISNULL(F_TASK_ANS.TA_ANS_ANSWER,0) END) AS NUMERIC(9,2)) AS 'ACTUAL' 
-- actual value will be null until filled in each year therefore ISNULL added to replace null with 0.00. 
FROM F_TASK_ANS INNER JOIN F_TASKS ON F_TASK_ANS.TA_ANS_FKEY_TA_SEQ = F_TASKS.TA_SEQ 
WHERE TA_ANS_ANSWER <> '' 
AND (TA_TASK_ID LIKE '%6051' OR TA_TASK_ID LIKE '%6052') 
-- The two numbers above refer to separate PPM questions that the user enters a value into 

我试图GROUP BY“YEAR”但我得到一个

Error: Each GROUP BY expression must contain at least one column that is not an outer reference - which I assume is because I haven't linked the 2 tables in any way...

我应该加入UNION所以表的连接?

我希望看到的是类似如下的输出(我将在后面绘制了)

YEAR FORECAST ACTUAL 
2013 135000  127331 
2014 143000  145102 
2015 149000   0 
2016 158000   0 
2017 161000   0 
2018... etc 

任何帮助或指导将非常感激。 感谢

+1

哪个SQL数据库是这? – Shiva

+0

SQL Server 2008(由第三方托管) –

回答

0

虽然语法很毛,这似乎是一个相当简单的查询。事实上,你连接你的两个表(使用JOIN语句)并且你不需要一个UNION。

尝试是这样的(使用公用表表达式,或者CTE,使分组更清晰,并改变了语法稍大清晰度):

WITH data 
AS (
    SELECT YEAR = CAST((LEFT(A.TA_ANS_QUESTION,4)) AS INTEGER) 
     , FORECAST = CASE WHEN A.TA_ANS_QUESTION LIKE '%forecast' 
          THEN CONVERT(NUMERIC(9,2), A.TA_ANS_ANSWER) 
          ELSE CONVERT(NUMERIC(9,2), 0) 
         END 
     , ACTUAL = CASE WHEN A.TA_ANS_QUESTION LIKE '%actual' 
         THEN CONVERT(NUMERIC(9,2), ISNULL(A.TA_ANS_ANSWER,0)) 
         ELSE CONVERT(NUMERIC(9,2), 0) 
        END 
    FROM F_TASK_ANS A 
     INNER JOIN F_TASKS T 
      ON A.TA_ANS_FKEY_TA_SEQ = T.TA_SEQ 
    -- It sounded like you wanted to include the ones where the answer was null. If 
    -- that's wrong, get rid of the test for NULL. 
    WHERE (A.TA_ANS_ANSWER <> '' OR A.TA_ANS_ANSWER IS NULL) 
     AND (TA_TASK_ID LIKE '%6051' OR TA_TASK_ID LIKE '%6052') 
) 
    SELECT  YEAR 
     ,  FORECAST = SUM(data.Forecast) 
     ,  ACTUAL = SUM(data.Actual) 
    FROM  data 
    GROUP BY YEAR 
    ORDER BY YEAR 
+0

嗨,非常感谢您的帮助,不幸的是,它只是产生一个错误(没有提及为什么),所以我不能确认它是否按我的需要工作。我没有足够的知识去研究可能导致失败的原因。抱歉。 –

+0

@GaryGibson它有什么错误?你在其他地方提到的转换错误? –

+0

对不起,屏幕只是空白与预设错误屏幕说联系您的管理员(托管系统!)。 –

0

尝试这样的事情......

SELECT CAST((LEFT(F_TASK_ANS.TA_ANS_QUESTION,4)) AS INT) AS [YEAR] 

     ,SUM(CAST((CASE WHEN F_TASK_ANS.TA_ANS_QUESTION LIKE '%forecast' 
     THEN F_TASK_ANS.TA_ANS_ANSWER ELSE 0 END) AS NUMERIC(9,2))) AS [FORECAST] 

    ,SUM(CAST((CASE WHEN F_TASK_ANS.TA_ANS_QUESTION LIKE '%actual' 
     THEN F_TASK_ANS.TA_ANS_ANSWER ELSE 0 END) AS NUMERIC(9,2))) AS [ACTUAL] 

FROM F_TASK_ANS INNER JOIN F_TASKS 
ON F_TASK_ANS.TA_ANS_FKEY_TA_SEQ = F_TASKS.TA_SEQ 
WHERE TA_ANS_ANSWER <> '' 
AND (TA_TASK_ID LIKE '%6051' OR TA_TASK_ID LIKE '%6052') 
GROUP BY CAST((LEFT(F_TASK_ANS.TA_ANS_QUESTION,4)) AS INT) 
+0

感谢您的支持。我找不出为什么,但它返回以下SQL错误:将nvarchar值'664900.53'转换为数据类型int时转换失败。我无法看到转换正在发生的位置。该值由用户以小数(财务值)输入。 –

+0

非常感谢您的帮助M.Ali,非常感谢,但在此之际,其他人提供了完美的解决方案。不管怎么说,还是要谢谢你。 –

+0

不是一个问题,很高兴你找到了解决方案:) –