【发布时间】:2011-01-25 17:00:00
【问题描述】:
我想将所有消极的价值观和所有积极的价值观分组,有什么想法吗?
【问题讨论】:
我想将所有消极的价值观和所有积极的价值观分组,有什么想法吗?
【问题讨论】:
GROUP BY SIGN(field) 应该可以工作。
【讨论】:
SELECT SUM(CASE WHEN SomeColumn < 0 THEN 1 ELSE 0 END) AS negative_values,
SUM(CASE WHEN SomeColumn >=0 THEN 1 ELSE 0 END) AS non_negative_values
FROM YourTable
【讨论】:
到目前为止,Stefan 的解决方案似乎是最好的答案。如果您希望将 0 与正数分组,您可以使用
GROUP BY `field` >= 0
【讨论】:
试试这样的:
select count(*), IF(foo >= 0, "pos", "neg") as sign from test group by sign;
其中 foo 是具有正值或负值的列
编辑:如果您希望零值与正负值区别对待,Stefan 的解决方案会更加优雅和更好。
【讨论】:
>= 而不是 > - (恕我直言) 零与正数比负数更自然地相关联。
我知道这个问题是很久以前提出的,但它可能对将来的某人有所帮助。 注意:下面是在 SQL server 中测试的,我相信同样的逻辑也适用于 MySql。
declare @temp table(
id int,
amount decimal(18,2),
rate decimal(18,2),
isPositiveAmount bit,
isPositiveRate bit
)
insert into @temp values(1, 100.1, 12.3, null, null)
insert into @temp values(1, -1, -1, null, null)
insert into @temp values(2, 100.1, 12.32, null, null)
update @temp set isPositiveAmount = iif(amount >= 0, 1, 0), isPositiveRate = iif(rate >= 0, 1, 0)
select id, sum(amount), avg(rate), isPositiveAmount, isPositiveRate from @temp
group by id, isPositiveAmount, isPositiveRate
【讨论】: