2017-10-25 12 views
0

で私はこのような列を持つテーブルを持っている:SQL Serverの:グループは、計算列

enter image description here

が、私はその期間のすべての質問の平均遵守率を知りたいです。 開始日と終了日をパラメータとしてクエリに渡しています。

私は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.

どのように私はこの問題を解決することができますか?

平均レートグループを特定の期間別に知る方法はありますか?

+0

あなたの入力に予想される結果が得られますか? –

+0

変数のみでグループ化しようとしましたが、何もしません –

+0

計算された列 'RepMonthAndYear'は** const **ですので、グループ化する必要はありません。 'GROUP BY question'だけを使用してください。 –

答えて

0

次のテストデータとSQLがあれば、私はあなたがディスティブを得ることができます。ここで

CREATE TABLE tableA (
    question  VARCHAR(50), 
    AnswerValue INT, 
    startdate DATE, 
    endate  DATE 
); 

INSERT INTO tableA VALUES ('Question A', 1, '2017-06-25', '2017-06-26'); 
INSERT INTO tableA VALUES ('Question A', 1, '2017-06-27', '2017-06-27'); 
INSERT INTO tableA VALUES ('Question A', 2, '2017-06-27', '2017-06-27'); 
INSERT INTO tableA VALUES ('Question B', 1, '2017-06-11', '2017-06-12'); 
INSERT INTO tableA VALUES ('Question B', 2, '2017-06-13', '2017-06-13'); 
INSERT INTO tableA VALUES ('Question B', 1, '2017-06-13', '2017-06-13'); 
INSERT INTO tableA VALUES ('Question C', 1, '2017-06-20', '2017-06-20'); 
INSERT INTO tableA VALUES ('Question C', 1, '2017-06-23', '2017-06-23'); 
INSERT INTO tableA VALUES ('Question D', 2, '2017-06-01', '2017-06-01'); 

INSERT INTO tableA VALUES ('Question E', 1, '2017-10-11', '2017-10-11'); 
INSERT INTO tableA VALUES ('Question E', 1, '2017-10-15', '2017-10-15'); 
INSERT INTO tableA VALUES ('Question F', 1, '2017-10-20', '2017-10-20'); 
INSERT INTO tableA VALUES ('Question F', 2, '2017-10-20', '2017-10-20'); 
INSERT INTO tableA VALUES ('Question F', 2, '2017-10-20', '2017-10-20'); 
INSERT INTO tableA VALUES ('Question G', 1, '2017-10-26', '2017-10-26'); 
INSERT INTO tableA VALUES ('Question H', 1, '2017-10-26', '2017-10-26'); 
INSERT INTO tableA VALUES ('Question H', 2, '2017-10-26', '2017-10-26'); 
INSERT INTO tableA VALUES ('Question I', 1, '2017-10-26', '2017-10-26'); 

あなたのクエリの結果は:

Question A 2 0 3 66,6667 
Question B 2 0 3 66,6667 
Question C 2 0 2 100 
Question D 0 0 1 0 
Question E 2 0 2 100 
Question F 1 0 3 33,3333 
Question G 1 0 1 100 
Question H 1 0 2 50 
Question I 1 0 1 100 

私はあなたのSQLを簡素化でき、いくつかのコードの重複を削除して、多分それはあなたの意図した質問でした。

DECLARE @StartDate DATE = '2017-06-01'; 
DECLARE @EndDate DATE = '2017-06-30'; 
DECLARE @StartDate2 DATE = '2017-10-01'; 
DECLARE @EndDate2 DATE = '2017-10-30'; 

WITH 
periods AS (
SELECT @StartDate as startdate, 
     @EndDate as enddate  
UNION 
SELECT @StartDate2 as startdate, 
     @EndDate2 as enddate 
) 
SELECT t.Question, t.Met, t.NA, t.MetNotMet, 
     CASE WHEN (t.Met) = 0 THEN 0 ELSE ROUND(((CONVERT(FLOAT,(t.Met))/(t.MetNotMet))* 100),4) END as CompRate 
    FROM (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  
      FROM tableA AS a 
      JOIN (SELECT p.startdate, 
         p.enddate, 
         DATENAME(DAY, p.startdate) + ' ' + DATENAME(MONTH, p.startdate) + ' ' + 
          DATENAME(YEAR, p.startdate) + ' To ' + DATENAME(DAY, p.enddate) + ' ' + 
          DATENAME(MONTH, p.enddate) + ' ' + DATENAME(YEAR, p.enddate) AS RepMonthAndYear 
        FROM periods p) AS p ON a.startdate >= p.startdate AND a.endate <= p.enddate 
     GROUP BY a.Question, p.RepMonthAndYear) AS t 
関連する問題