具有多个条件的SQL组查询

时间:2018-08-16 23:21:54

标签: sql-server

我对SQL非常陌生。我有以下问题,请帮助。如果天气将行值之一表示为“热”,我想创建新列“精确”,那么在新列“精确”中应该将其留空。如果天气中的所有值都表示“冷”,则在新的“精确”列中应该说“良好”。如果您有任何疑问,请告诉我。

city weather
a     Cold
a     Hot
a     warm
b     Cold
b     Hot
b     warm
c     Cold
c     Cold
c     Cold

2 个答案:

答案 0 :(得分:1)

编辑(该问题最初被标记为[mysql],正在讨论使用[redshit](原文如此),该问题现在被标记为[mssql](Microsoft SQL Server Transact-SQL)。现在已从此答案中删除了MySQL特定语法。)


作为另一个替代方法(对于Nick的GROUP_CONCAT方法),我们可以获得行数的计数,并将其与具有{{1}的行数进行比较}。如果计数相等,那么我们知道所有行都满足该条件。

weather = 'Cold'

要查看其工作原理,我们可以在SELECT列表中添加更多表达式

 SELECT w.city
      , CASE 
        WHEN SUM(1) = SUM(CASE WHEN w.weather = 'Cold' THEN 1 END)
        THEN 'good'
        ELSE ''
        END     AS exact 
   FROM mytable w
  GROUP BY w.city
  ORDER BY w.city

MySQL特定的 , SUM(1) AS count_all_rows , SUM(CASE WHEN w.weather = 'Cold' THEN 1 END) AS count_cold_rows 函数和其他MySQL速记可以替换为更具移植性,更符合ANSI标准的IF表达式,以获得等效的结果...


如果我们要返回CASE的计算值以返回原始表的每一行,则可以将上面的查询用作内联视图并执行JOIN操作...

exact

答案 1 :(得分:0)

使用case when

 select t.city, case when Hot>1 then '' 
 else case when cold= total_c then 'Good' end end   as exact  
  from    
(select city,
  sum( case when weather ='Hot' then 1 else 0 end) as Hot,
  sum( case when weather='Cold' then 1 else 0 end) as cold
  from yourtable
  group by city
 ) as t
inner join (select city,count(*) as total_c from yourtable group by 
            city) t1
 on t.city=t1.city

http://sqlfiddle.com/#!17/2b8f3/3的Postgresql链接

city    exact
c       Good
b     
a   

http://sqlfiddle.com/#!9/2b8f3b/1 mysql链接