SQL: 使用 DATEPART 和内连接

SQL: using DATEPART and Inner join

我正在熟悉 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

应该是这样的:当然没有样本数据很难测试,但是你可以根据需要进行调整。

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

您可以从第一个查询中提供所需的所有信息,而无需内部联接,因为您是从同一个 table 请求的。类似于以下查询的内容应该适用于每周数据 return.

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)