2017-01-30 15 views
0

Я знакомлюсь с DATEPART и в этом случае часть недели, чтобы получить результаты в неделю и так далее.SQL: использование DATEPART и Inner join

Я получил его для работы с этим следующим запросом.

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 Server Compact!)

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 is error_, пожалуйста, разместите всю ошибку, а не смутное воспоминание об этом. –

+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 clause =, date] ', я не знаю об этом, но когда я получил этот запрос, работающий с самого начала, без материала datepart, потребность в внутреннем соединении состояла в том, что я не мог объединить MAX (..) с SUM (..), потому что MAX даст только один результат, а SUM даст больше результатов, потому что в базе данных с той же датой иногда бывает несколько строк! –

+0

Проблема заключалась в том, что мне нужно группировать выражение, а не псевдоним, я отредактирую его с помощью правильного запроса. Кроме того, поскольку sum и max являются совокупными операндами, они могут работать вместе. – AlbertoCh

+0

Вау, это действительно круто! Возможно, моя предыдущая проблема была связана с тем, что я группировался по дате, когда я не использовал datepart, или он все еще работает как с max, так и с суммой? –