2017-01-30 9 views
0

DATEPART 및이 경우에는 주 부분에 익숙해 져서 매주 결과를 얻습니다.SQL : DATEPART 및 내부 조인 사용

다음 쿼리를 사용하여 작업하게되었습니다. 그것은 나에게 오류를 주면서

var querytest = "SELECT DATEPART(wk, date), sum((kg * rep * sett)) as weight, 
sum(kg/max * rep * sett) as avg, sum((rep * sett)) as reps 
FROM Test WHERE date between @0 and @1 AND exercise < 4 GROUP BY DATEPART(wk, date)"; 

그러나 정말 내가 원하는 모든 일을하지 않는, 또한 해당 쿼리에 날짜를 추가 할 수 없습니다. 이와 같이 ...sum((rep * sett)) as reps, date FROM

           ^

날짜가 위와 같습니다. 그것은 결국 그룹화와 함께 뭔가에 대한 오류를주었습니다.

하지만 다음 쿼리에서 datepart (wk)를 사용하고 싶습니다. 어떻게해야할까요? (SQL 서버 컴팩트를 사용!)

var querythiss = "SELECT DATEPART(wk, date), SUM(kg * rep * sett) as weight, SUM(kg/max * rep * sett) as avg, SUM(rep * sett) as reps, " + 
       " t.date, pk.peak FROM Test t INNER JOIN (SELECT MAX(kg/max) as peak, date FROM Test WHERE date BETWEEN @0 AND " + 
       " @1 AND exercise < 4 group by date) as pk on t.date = pk.date WHERE t.date BETWEEN @0 AND @1 AND exercise < 4 GROUP " + 
       "BY t.date, pk.peak"; 

또는이 쉽게 읽을 경우이 같은

.

SELECT DATEPART(wk, date), 
    SUM(kg * rep * sett) as weight, 
    SUM(kg/max * rep * sett) as avg, 
    SUM(rep * sett) as reps, 
    t.date, pk.peak 
FROM Test t INNER JOIN 
(
    SELECT MAX(kg/max) as peak, date 
    FROM Test 
    WHERE date BETWEEN @0 AND @1 
    AND exercise < 4 
    GROUP BY date 
) as pk on t.date = pk.date 
WHERE t.date BETWEEN @0 AND @1 AND exercise < 4 
GROUP BY t.date, pk.peak 
+0

오류 메시지를 추가 할 수 있습니까? – McNets

+0

최종 쿼리에서 작동하려는, _what은 오류입니다. 전체 오류를 게시하십시오. 모호하지 않습니다. –

+2

구문 : 별칭이 필요합니다. DATEPART (wk, t.date) 그렇지 않으면 날짜가 모호합니다. – Serg

답변

2

은 다음과 유사해야합니다. 물론 샘플 데이터가 없어도 테스트가 어렵지만 필요에 따라 조정할 수 있습니다.

SELECT pk.dateWeek, 
    SUM(kg * rep * sett) as weight, 
    SUM(kg/max * rep * sett) as avg, 
    SUM(rep * sett) as reps, 
    pk.peak 
FROM Test t 
INNER JOIN 
(
    SELECT MAX(kg/max) as peak, DATEPART(wk, date) as dateWeek 
    FROM Test 
    WHERE date BETWEEN @0 AND @1 
    AND exercise < 4 
    GROUP BY DATEPART(wk, date) 
) as pk on DATEPART(wk, t.date) = pk.dateWeek 
WHERE date BETWEEN @0 AND @1 
AND exercise < 4 
GROUP BY pk.dateWeek, pk.peak 
1

동일한 테이블에서 요청하기 때문에 내부 조인이 필요없이 첫 번째 쿼리에서 필요한 모든 정보를 제공 할 수 있습니다. 다음 쿼리와 같은 것이 매주 데이터 반환을 위해 작동해야합니다.

SELECT DATEPART(wk, date) as wknumber, sum((kg * rep * sett)) as weight, 
sum(kg/max * rep * sett) as avg, sum((rep * sett)) as reps, 
max(kg/max) as peak 
FROM Test WHERE date between @0 and @1 AND exercise < 4 GROUP BY DATEPART(wk, date) 
+0

이 결과를 얻었습니다.'집계 및 그룹화 표현식에서 SELECT 절에는 집계 및 그룹화 표현식 만 포함될 수 있습니다. [Select 절 =, date]', 나는 이것에 대해 많이 알지 못한다. 그러나이 쿼리가 맨 처음부터 작업 할 때 datepart 항목이 없으면 MAX를 결합 할 수 없기 때문에 내부 조인의 필요성이있다.)와 SUM (..왜냐하면 MAX는 같은 날짜의 데이터베이스에 하나 이상의 행이 있기 때문입니다. –

+0

문제는 별칭이 아닌 표현식으로 그룹화해야한다는 것이므로 올바른 쿼리로 편집 할 것입니다. 또한 sum과 max는 둘 다 집계 피연산자이기 때문에 함께 작동 할 수 있습니다. – AlbertoCh

+0

와우, 정말 멋지다! 아마도 나의 이전 문제는 내가 datepart를 사용하지 않았을 때 날짜별로 그룹화했기 때문일 것인가 아니면 여전히 max와 sum으로 모두 작동합니까? –