开发者

conditional group by

开发者 https://www.devze.com 2023-03-07 01:35 出处:网络
I need to apply group by only for a particular data. for ex: id name 1xx 2xx 3xx 4yy 5yy 6zz and after applying group by to xx it should be like

I need to apply group by only for a particular data.

for ex:

id name
1  xx
2  xx
3  xx
4  yy
5  yy
6  zz

and after applying group by to xx it should be like

1 xx
4 yy
5 yy
6 z开发者_C百科z


I would use a UNION

SELECT MIN(id), name
FROM MyTable
WHERE name = 'xx'
GROUP BY name

UNION

SELECT id, name
FROM MyTable
WHERE name <> 'xx'

But without much more info to go on this is most likely wrong.

Tip - Don't assume anybody knows what you are talking about, sometimes they will. But always try to spell things out with as much details as you can. You will get more insightful answers that way and more people will be inclined to help.


Since you seem to want the minimum value of ID for 'xx', the original values of ID for 'yy' and the maximum value of ID for 'zz' (edit: though I now see that there is but one entry for 'zz', so it could be MIN instead of MAX, or it might be unaggregated), it is not clear that we can really generalize for you.

SELECT MIN(ID) AS ID, Name
  FROM AnonymousTable
 WHERE Name = 'xx'
 GROUP BY Name
UNION
SELECT ID      AS ID, Name
  FROM AnonymousTable
 WHERE Name = 'yy'
UNION
SELECT MAX(ID) AS ID, Name
  FROM AnonymousTable
 WHERE Name = 'zz'
 GROUP BY Name

This fits the data given in the question. You might also have a two-branch UNION with 'yy' and not 'yy' treated differently.

You might be able to use a calculated column in a better defined, more systematic scenario:

SELECT CASE Name WHEN 'yy' THEN ID ELSE 1 END AS Pseudo_ID, Name -- , COUNT(*) AS number
  FROM AnonymousTable
 GROUP BY Pseudo_ID, Name

You would normally use some aggregate function (such as COUNT) in the select-list to warrant a GROUP BY clause; otherwise, you can use a simple DISTINCT to eliminate duplicates.


select distinct id, name from table order by id asc;

0

精彩评论

暂无评论...
验证码 换一张
取 消