我正在尝试构建一个SQL查询,其中我按1列分组,但随后还包括每个组中任意记录的其他列的值。所以,像
SELECT BoxNo
FROM MuffinData
WHERE FrostingTimeApplied >= CONVERT(date, GETDATE())
GROUP BY BoxNo
但是在结果中包含了MuffinType
列,FrostingType
列中的一些值(我知道每个框只有MuffinType
和FrostingType
的值。)< / p>
答案 0 :(得分:1)
您必须为所选的每个列使用一个聚合函数,该函数在GROUP BY
子句中不存在:
SELECT BoxNo, MAX(MuffinType) AS MuffinType, MAX(FrostingType) AS FrostingType
FROM MuffinData
WHERE FrostingTimeApplied >= CONVERT(date, GETDATE())
GROUP BY BoxNo
如果每个框只有MuffinType
和FrostingType
的值,则在上述查询中将选择每个框中的这些唯一值no。
答案 1 :(得分:1)
我知道MuffinType和FrostingType只有1个值 每盒
如果情况确实如此,那么简单的DISTINCT就应该这样做:
SELECT DISTINCT BoxNo, MuffinType, FrostingType
FROM MuffinData
WHERE FrostingTimeApplied >= CONVERT(date, GETDATE());
如果情况并非如此,那么您正在处理通常称为每组前N 问题的问题。您可以找到问题的覆盖范围和建议的解决方案here。
干杯, 伊茨克
答案 2 :(得分:0)
如果您按任何方式进行分组,那么在单个语句中执行此操作的唯一方法(我知道)是让您返回的其他列是聚合函数的结果。聚合函数是任何采用多个值但返回单个结果的函数,如:SUM,MAX,MIN,COUNT等......
SELECT BoxNo, COUNT(MuffinData.ID), MAX(FrostingType.FlavorID) FROM MuffinData, FrostingType etc...
您可能需要调整WHERE逻辑或在FROM列表(子查询)中使用其他数据源。
答案 3 :(得分:0)
您可以使用CTE并连接回原始表格以获取所需的字段。在这种情况下,
WITH BoxGroup AS (SELECT BoxNo FROM MuffinData WHERE FrostingTimeApplied >= CONVERT(date, GETDATE()) GROUP BY BoxNo) SELECT md.BoxNo,md.MuffinType,md.FrostingType FROM MuffinData md INNER JOIN BoxGroup bg ON bg.BoxNo = md.BoxNo