で私はこのような列を持つテーブルを持っている:SQL Serverの:グループは、計算列
が、私はその期間のすべての質問の平均遵守率を知りたいです。 開始日と終了日をパラメータとしてクエリに渡しています。
私は2つの期間にしたいのであれば、私は最初の期間と@StartDate2
(1/10/17)用@StartDate
(例えば1/6/17)と@EndDate
(例えば30/6/17)を通過し、@EndDate2
ています(31/10/17)を第2の期間使用する。
私のSQLクエリは次のとおりです。このSQLクエリで
;WITH tmpTab AS
(
SELECT
question,
SUM((CASE WHEN AnswerValue = 1 THEN 1 ELSE 0 END)) Met,
SUM((CASE WHEN AnswerValue = 3 THEN 1 ELSE 0 END)) NA,
SUM((CASE WHEN (ISNULL(AnswerValue,3) <> 3) THEN 1 ELSE 0 END)) MetNotMet,
DATENAME(DAY, @StartDate) + ' ' + DATENAME(MONTH, @StartDate) + ' ' +
DATENAME(YEAR, @StartDate) + ' To ' + DATENAME(DAY,@EndDate) + ' ' +
DATENAME(MONTH, @EndDate) + ' ' + DATENAME(YEAR, @EndDate) AS RepMonthAndYear
FROM
tableA
WHERE
startdate >= @StartDate AND endate <= @EndDate
GROUP BY
Question
UNION ALL
SELECT
question,
SUM((CASE WHEN AnswerValue = 1 THEN 1 ELSE 0 END)) Met,
SUM((CASE WHEN AnswerValue = 3 THEN 1 ELSE 0 END)) NA,
SUM((CASE WHEN (ISNULL(AnswerValue,3) <> 3) THEN 1 ELSE 0 END)) MetNotMet,
DATENAME(DAY,@StartDate2)+' '+DATENAME(MONTH,@StartDate2)+' '+DATENAME(YEAR,@StartDate2)+ ' To ' + DATENAME(DAY,@EndDate2)+' '+DATENAME(MONTH,@EndDate2)+' '+DATENAME(YEAR,@EndDate2) AS RepMonthAndYear
FROM
tableA
WHERE
startdate >= @StartDate2 AND endate <= @EndDate2
GROUP BY
Question
)
SELECT
Question, Met, NA, MetNotMet,
CASE WHEN (Met) = 0 THEN 0 ELSE ROUND(((CONVERT(FLOAT,(Met))/(MetNotMet))* 100),4) END as CompRate
FROM
tmpTab
、私はそれが計算された列であるように私が行うことができないもRepMonthAndYear
列によってグループにする必要があります。エラー "無効な列"が表示されます。
そして、私はこのGROUP BY
句を使用する場合:
(DATENAME(DAY,@StartDate2)+' '+DATENAME(MONTH,@StartDate2)+' '+DATENAME(YEAR,@StartDate2)+ ' To ' + DATENAME(DAY,@EndDate2)+' '+DATENAME(MONTH,@EndDate2)+' '+DATENAME(YEAR,@EndDate2))
を、私はこのエラーを取得する:
Each GROUP BY expression must contain at least one column that is not an outer reference.
どのように私はこの問題を解決することができますか?
平均レートグループを特定の期間別に知る方法はありますか?
あなたの入力に予想される結果が得られますか? –
変数のみでグループ化しようとしましたが、何もしません –
計算された列 'RepMonthAndYear'は** const **ですので、グループ化する必要はありません。 'GROUP BY question'だけを使用してください。 –