SQL - 要按第三个未连接值分组的2个表值

时间:2014-02-09 20:55:54

标签: sql sql-server-2008 join union

我想创建一个图表,用于从SQL数据库中生成的2个用户问题中提取数据。

问题是用户问题存储在同一个表中,答案也是如此。唯一的连接是问题字符串包含一个年份值,我使用 LEFT 命令提取该值,以便输出一个名为“ YEAR ”的列,其中包含一个整数值列表从2013年到2038年(25年期间)。 然后我想从每个''中提取相应的答案('预测'和'实际'),以便我可以绘制每年有几个值的图表(对不起,如果这不是'没有任何意义)。该图表应显示涵盖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',但我得到了

  

错误:每个GROUP BY表达式必须包含至少一个列   不是外部参考 - 我认为这是因为我没有联系   以任何方式表2 ...

我应该添加 UNION 以便表格加入吗?

我想看到的是类似下面的输出(稍后我将图表)

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

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

2 个答案:

答案 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)

答案 1 :(得分: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