SQL组与条件相似

时间:2017-07-05 10:30:28

标签: sql sql-server group-by where sql-like

假设有一个SQL表:testTable,其列为:clientID,colA,colB,colC。

reference   clientID    colA    colB    colC
---------------------------------------------
001            1        test1   test2   test3
002            1        test1   ball2   test3
003            2        test1   ball2   test3
004            2        test1   ball2   test3
005            3        test1   test2   test3
006            4        test1   test2   test3
007            4        test1   test2   test3
009            5        test1   ball2   test3
---------------------------------------------

我想选择colB类似'test'的所有不同行,并按clientID分组。所以我最终得到:

reference    clientID    colA    colB    colC
----------------------------------------------
001             1        test1   test2   test3
005             3        test1   test2   test3
006             4        test1   test2   test3
----------------------------------------------

编辑: 参考栏是唯一的 如果我使用 选择distinct * .. from ..其中colB像'%test%'group by clientID 然后返回的结果没有clientID分组

6 个答案:

答案 0 :(得分:4)

当您按一列分组时,您将多行转换为一行,而select中的其他列必须是聚合函数或子查询。使用哪种功能取决于您的需要。如果与字符串列

一起使用,使用下面示例中的MIN()将按字母顺序给出第一个结果
SELECT clientID
    , MIN(colA) AS colA
    , MIN(colB) AS colB
    , MIN(colC) AS colC
FROM tableA
WHERE colB LIKE '%test%'
GROUP BY clientID

编辑: 这是另一个解决方案,不是使用GROUP BY,而是使用ROW_NUMBER()

的公用表表达式
WITH CTE_Source AS 
(
  SELECT *
  FROM TableA
  WHERE colB LIKE '%test%'
) 
, CTE_Filter AS 
(
   SELECT *, ROW_NUMBER() OVER (PARTITION BY ClientID ORDER BY reference) RN
   FROM CTE_Source 
)
SELECT * 
FROM CTE_Filter 
WHERE RN = 1

答案 1 :(得分:1)

只是一个不同的是不够的?

Select distinct * from #data where ColB like 'test%'

如果您只需要在不同的

上考虑某些列,则可以使用带有关系的前1名
Select top (1) with ties * from #groupby where ColB like 'test%'
order by row_number() over(partition by clientid order by cola,colb,colc)--you can include your required columns only

答案 2 :(得分:0)

where子句在having和group by之前。如果要在分组之前过滤掉记录,条件在where子句中进行,如果要过滤掉分组记录,则条件包含在having子句中:

select ...
from ...
where ...
group by ...
having ...

或类似的东西,如果上面的东西没有工作

select ...
from (
   select ...
   from ...
   where ...
   group by ...
   having ...
) x
where ...

答案 3 :(得分:0)

试试这个,

 Select distinct * From tableA where colB like '%test%'

答案 4 :(得分:0)

使用GROUP BY时,必须指定在查询中使用的所有列,并且不使用聚合函数。 所以,例如,

SELECT CLIENTID, COLA, COLB, COLC, COUNT(*) AS RC
FROM YOURTABLE
WHERE COLB LIKE '%test%'
GROUP BY CLIENTID, COLA, COLB, COLC

答案 5 :(得分:0)

只需使用: -

group by  clientID,colA,colB,colC

而不是

group by  clientID

演示: -

Create table testTable (clientID int , colA varchar(10), colB varchar(10), colC varchar(10))
go
insert into testTable values
(1,'test1','test2','test3'),
(1,'test1','ball2','test3'),
(2,'test1','ball2','test3'),
(2,'test1','ball2','test3'),
(3,'test1','test2','test3'),
(4,'test1','test2','test3'),
(4,'test1','test2','test3'),
(5,'test1','ball2','test3')


select * from testTable
where colB LIKE '%test%'
group by  clientID,colA,colB,colC

输出: -

clientID    colA    colB    colC
  1        test1    test2   test3
  3        test1    test2   test3
  4        test1    test2   test3