2016-06-01 22 views
1

SQlサーバーで以下のSQLを使用して会計年度別に注文したいが、 '無効な列名' MONTH ''というエラーメッセージが表示される。私はあなたが私の下のSQLを変更するのを助けることができるのだろうかと思います。ありがとう!SQL Server 2008会計年度別注文

SELECT 'Closed Home' AS STATUS, 
    right(CONVERT(VARCHAR(8), Closed_Dt, 3),5) as "MONTH", 
    COUNT(Home_ID) COUNT 
FROM Home 
GROUP BY HOME_STATUS,right(CONVERT(VARCHAR(8), Closed_Dt, 3),5) 
HAVING Facility_STATUS IN ('CLOSED') 

UNION 

SELECT 'New Placement' AS STATUS, 
right(CONVERT(VARCHAR(8), EFFECT_DT, 3),5) AS "MONTH", 
COUNT(CLT_NBR) AS COUNT 
FROM STATUS S 
GROUP BY right(CONVERT(VARCHAR(8), EFFECT_DT, 3),5)  
ORDER BY status, 
    case "MONTH" when '07/15' then 1 
       when '08/15' then 2 
       when '09/15' then 3 
       when '10/15' then 4 
       when '11/15' then 5 
       when '12/15' then 6 
       when '01/16' then 7 
       when '02/16' then 8 
       when '03/16' then 9 
       when '04/16' then 10 
       when '05/16' then 11 
       when '06/16' then 12 
    end 
+1

...ちょうど派生テーブルにあなたのメインクエリを移動して、MONTH列を使用することができます。あなたはそのことを更新するあなたのキャリアの残りを過ごすでしょう!この結果は 'ORDER BY EFFECT_DT'と' CLOSED_DT'だけとはどのように違いますか? –

+0

その場合、'01/16 'は'07/15'の前に来ます。私はその結果を年度と月ごとにソートしたい。だから'07/15 'は'01/06'の前に来る。 – Ice

+0

「EFFECT_DT」と「CLOSED_DT」のタイプは?それらが 'DATE'または' DATETIME'の場合、それらは正しくソートされます。それらが文字列の場合、それらをリファクタリングすることを検討してください。 –

答えて

0
SELECT 'Closed Home' AS STATUS, 
     right(CONVERT(VARCHAR(8), Closed_Dt, 3),5) as "MONTH", 
     COUNT(Home_ID) COUNT 
    FROM Home 
    GROUP BY HOME_STATUS,right(CONVERT(VARCHAR(8), Closed_Dt, 3),5) 
    HAVING Facility_STATUS IN ('CLOSED') 

    UNION 

    SELECT 'New Placement' AS STATUS, 
    right(CONVERT(VARCHAR(8), EFFECT_DT, 3),5) AS "MONTH", 
    COUNT(CLT_NBR) AS COUNT 
    FROM STATUS S 
    GROUP BY right(CONVERT(VARCHAR(8), EFFECT_DT, 3),5)  
    ORDER BY status, 
     case right(CONVERT(VARCHAR(8), EFFECT_DT, 3),5) when '07/15' then 1 
        when '08/15' then 2 
        when '09/15' then 3 
        when '10/15' then 4 
        when '11/15' then 5 
        when '12/15' then 6 
        when '01/16' then 7 
        when '02/16' then 8 
        when '03/16' then 9 
        when '04/16' then 10 
        when '05/16' then 11 
        when '06/16' then 12 
     end 
+0

ありがとうございました。ただし、「月」の列はClosed_DtとEffect_DTの2つの異なる日付に由来します。 – Ice

0

あなたはそれがORDER BY句でだにもかかわらず、CASE式でエイリアスを参照できないので、エラーを取得しています。

これは動作するはずです:

... 
case right(CONVERT(VARCHAR(8), Closed_Dt, 3),5) 
... 
+0

あなたの返事をありがとう。 – Ice

2

を、あなたは `CASE`文のことをしないでください

SELECT * FROM (
    SELECT 'Closed Home' AS STATUS, 
      RIGHT(CONVERT(VARCHAR(8),Closed_Dt,3),5) AS "MONTH", 
      COUNT(Home_ID) COUNT 
    FROM Home 
    GROUP BY HOME_STATUS, 
      RIGHT(CONVERT(VARCHAR(8),Closed_Dt,3),5) 
    HAVING Facility_STATUS IN ('CLOSED') 
    UNION 
    SELECT 'New Placement' AS STATUS, 
      RIGHT(CONVERT(VARCHAR(8),EFFECT_DT,3),5) AS "MONTH", 
      COUNT(CLT_NBR) AS COUNT 
    FROM STATUS S 
    GROUP BY RIGHT(CONVERT(VARCHAR(8),EFFECT_DT,3),5) 
) t 
ORDER BY status, 
     CASE "MONTH" 
      WHEN '07/15' THEN 1 
      WHEN '08/15' THEN 2 
      WHEN '09/15' THEN 3 
      WHEN '10/15' THEN 4 
      WHEN '11/15' THEN 5 
      WHEN '12/15' THEN 6 
      WHEN '01/16' THEN 7 
      WHEN '02/16' THEN 8 
      WHEN '03/16' THEN 9 
      WHEN '04/16' THEN 10 
      WHEN '05/16' THEN 11 
      WHEN '06/16' THEN 12 
     END 
+0

あなたの答えをありがとう!これは私が探している答えです。 – Ice

+0

このように@Cindyを実行すると、内部クエリにYEAR(Closed_Dt)のように "O_YEAR"、MONTH(Closed_Dt)を "O_MONTH"として列を追加することができます。それらを実際に出力に含めることなく – JamieD77

関連する問題