SQL错误如何使用GROUP BY

时间:2017-12-29 10:51:08

标签: sql sql-server

我正在尝试使用GROUP BY命令执行SQL查询但我无法使其工作我尝试使用聚合函数来解决问题,但我认为下面正确执行它的更好方法是我的SQL查询。

SELECT TOP 100 cModel ,fdate, BoardSN 
FROM FovComp 
GROUP BY fdate ORDER BY CONVERT(datetime, fdate) DESC

错误低于

  

专栏' FovComp.cModel'在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。

我想要所有列,但必须按fdate分组。任何建议都会很棒。

3 个答案:

答案 0 :(得分:2)

GROUP BY对计数,求和或平均有用,但你没有做到这一点。并且你必须这样做,否则GROUP BY毫无意义,不被允许。

使用示例:

SELECT fdate, COUNT(cModel) AS COUNT_cModel, COUNT(BoardSN) AS COUNT_BoardSN
FROM FovComp 
GROUP BY fdate
ORDER BY CONVERT(datetime, fdate) DESC

答案 1 :(得分:2)

如果您正在寻找每个型号的最新数据,那么您可以使用排名功能执行此操作:

WITH CTE
AS
(
   SELECT cModel ,fdate, BoardSN,CONVERT(datetime, fdate) AS fdate,
     ROW_NUMBER() OVER(PARTITION BY cModel
                       ORDER BY CONVERT(datetime, fdate) DESC) AS RN
   FROM FovComp 
)
SELECT TOP 100 cModel ,fdate, BoardSN 
FROM CTE
WHERE RN = 1
ORDER BY fdate DESC;

此外,如果您要查找每个型号的前100名,可以使用WHERE RN <= 100

  

我想COUNT cModel并选择所有列并按fdate对其进行分组,然后您就可以执行此操作:

WITH CTE
AS
(
    SELECT 
      fdate,
      COUNT(cModel) AS ModelsCount
    FROM FovComp 
    GROUP BY fdate
)
SELECT f.*, c.ModelsCount
FROM FovComp AS f
INNER JOIN CTE AS c ON f.fdate = c.fdate ;

答案 2 :(得分:0)

我认为你需要这个:

SELECT *
FROM
(
    SELECT 'ID_1' AS ID, ID_1 AS Value from table1
    UNION ALL
    SELECT 'ID_2' AS ID, ID_2 AS Value from table1
    UNION ALL
    SELECT 'ID_3' AS ID, ID_3 AS Value from table1
) AS t1
INNER JOIN Table2 as T2  on T1.ID_1 = T2.ID_1
                        and T1.ID_2 = T2.ID_2
                        and T1.ID_3 = T2.ID_3;