我对SQL非常陌生。我有以下问题,请帮助。如果天气将行值之一表示为“热”,我想创建新列“精确”,那么在新列“精确”中应该将其留空。如果天气中的所有值都表示“冷”,则在新的“精确”列中应该说“良好”。如果您有任何疑问,请告诉我。
city weather
a Cold
a Hot
a warm
b Cold
b Hot
b warm
c Cold
c Cold
c Cold
答案 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