2014-02-09 51 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

不是一個問題,很高興你找到了解決方案:) –