我在编写SQL Server存储过程时需要一些帮助。所有数据分组均由 Train_B_N 。
组成预期结果:
with CTE as
(
select Train_B_N, Duration,Date,Trainer,Train_code,Training_Program
from Train_M
group by Train_B_N
)
select
*
from Train_M as m
join CTE as c on c.Train_B_N = m.Train_B_N
我的查询有什么问题?
答案 0 :(得分:0)
GROUP BY
将表格混合在一起,因此,如果没有GROUPED的列合并会导致数据出现问题。
select Train_B_N, Duration,Date,Trainer,Train_code,Training_Program
from Train_M
group by Train_B_N
按ANSI
标准,GROUP BY
必须包含SELECT
语句中不在聚合函数中的所有列。没有例外。
WITH CTE AS (SELECT TRAIN_B_N, MAX(DATE) AS Last_Date
FROM TRAIN_M
GROUP BY TRAIN_B_N)
SELECT A.Train_B_N, Duration, Date,Trainer,Train_code,Training_Program
FROM TRAIN_M AS A
INNER JOIN CTE ON CTE.Train_B_N = A.Train_B_N
AND CTE.Last_Date = A.Date
此示例将返回该ID使用的最后一个培训计划,培训师,train_code。
这是通过MAX(DATE)
聚合函数实现的,该函数在表中保留了最大(最新)的DATE。由于GROUP BY将行打破为不同的分组,因此JOIN仅返回表格结果的一部分。
请注意,SQL
将返回#table_rows X #Matching_rows,如果#Matching_rows cardinality
大于1,您将获得额外的行。
查找GROUP BY - MSDN。我建议你先阅读语法示例之外的所有内容,然后看看该条款的目的是什么。
另外,下次尝试使用Google搜索您的问题:' GROUP BY,SQL'或者插入IDE
(SSMS
或其他)给出的错误代码。您需要了解为什么工作正常...... SO
可以提供帮助,而不是您的Google搜索引擎。 ;)
希望您发现这开始您对学习SQL的所有兴趣。 :d