2017-08-18 304 views
0

毎年毎月の注文数を取得しようとしていますが、いくつかの関連する関数があります。役に立った集計関数またはGROUP BY句に含まれていないため、選択リストで列が無効です

まず日付要素(M、受注日)、DATEPART(Y、受注日)ですので、次のように私は自分のコードを書いた:

select DATEPART(Q, OrderDate) Q , datepart(YEAR, OrderDate) Y, count(*) count 
from Orders 
group by DATEPART(Q, OrderDate), datepart(Y, OrderDate); 

を、それはエラーがあります: 列 'をOrders.OrderDate' は無効です選択リストは集合関数またはGROUP BY句のいずれにも含まれていないため選択リストには含まれません。

そして、私は月(DATEORDER)を使用する試み、およびYear(DATEORDER)およびコードは以下の通りである:

select month(OrderDate) M , year(OrderDate) y, count(*) count 
from Orders 
group by month(OrderDate),year(OrderDate); 

上記のコードの結果は、それが成功であることを示しています。

私の質問は、最初のコードにエラーがありますが、2番目のコードが正しい理由は何ですか?ありがとう!

+0

混乱の中でだとして 'Q'は、SQL Server内のキーワードがあるため。 –

+0

とにかく日付部分の短縮形を使用しないでください。 http://sqlblog.com/blogs/aaron_bertrand/archive/2011/09/20/bad-habits-to-kick-using-shorthand-with-date-time-operations.aspx –

答えて

2

SELECTであなたがYEAR部分を探しdatepart(YEAR, OrderDate)を使用しているので、あなたがdatepart(Y, OrderDate)持っていることによって、グループ内 - Yは、YEARから短いではなく、実際のためDAYOFYEAR

ため

https://docs.microsoft.com/en-us/sql/t-sql/functions/datepart-transact-sql

ショートスタンド年はYY

クエリは次のように動作します。

select DATEPART(Q, OrderDate) Q , datepart(YEAR, OrderDate) Y, count(*) count 
from Orders 
group by DATEPART(Q, OrderDate), datepart(YY, OrderDate); 

あなたはこのDEMOで見ることができます - 230を与えるYを使用して、今日のために2017を与えるYYを使用して - それは230番目の日は、おそらく今年

+0

アップアップされましたが、ゴードンの仮説を次のようにテストしてください。よく複数の問題があります。 –

+0

@TimBiegeleisenが列を命名、テスト済み 'Q'および/または使用するには、' DATEPARTでQ'は何の問題 –

+0

@TimBiegeleisen http://sqlfiddle.com/#!6/69008/2 –

関連する問題