2017-10-25 1 views
0

에 의해 나는 다음과 같은 열이있는 테이블이 있습니다SQL 서버 : 그룹은 계산 된 열

enter image description here

내가 그 기간에 대한 모든 질문에 대한 평균 준수 비율을 알고 싶어요. 쿼리의 매개 변수로 시작 날짜와 종료 날짜를 전달합니다.

그래서 (이 개 내가 @StartDate을 전달하고 기간 (예 : 1/6/17)을하고 @EndDate (예 : 30/6/17) 첫 번째 기간과 @StartDate2 (1/10/17) 및 @EndDate2 원하는 경우 31/10/17).

내 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 절을 사용하는 경우 :

Each GROUP BY expression must contain at least one column that is not an outer reference.

가 어떻게이 문제를 해결할 수 :

(DATENAME(DAY,@StartDate2)+' '+DATENAME(MONTH,@StartDate2)+' '+DATENAME(YEAR,@StartDate2)+ ' To ' + DATENAME(DAY,@EndDate2)+' '+DATENAME(MONTH,@EndDate2)+' '+DATENAME(YEAR,@EndDate2)) 

을 나는이 오류가?

특정 기간별 평균 요율 그룹을 알 수있는 다른 방법이 있습니까?

+0

입력 할 때 예상되는 결과를 제공 할 수 있습니까? –

+0

변수로만 그룹화하려고하면 아무 것도하지 않겠습니다. –

+0

계산 된 열'RepMonthAndYear'는 ** const **이므로 그룹화 할 필요가 없습니다. 'GROUP BY question' 만 사용하십시오. –

답변

0

다음 테스트 데이터와 SQL이 주어지면 나는 당신이 discibe하는 것을 얻습니다. 여기

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