【问题标题】:MySql, how can I group by, in a select query on positve or negative?MySql,我如何在正面或负面的选择查询中分组?
【发布时间】:2011-01-25 17:00:00
【问题描述】:

我想将所有消极的价值观和所有积极的价值观分组,有什么想法吗?

【问题讨论】:

    标签: sql mysql group-by


    【解决方案1】:

    GROUP BY SIGN(field) 应该可以工作。

    【讨论】:

      【解决方案2】:
      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
      

      【讨论】:

        【解决方案3】:

        到目前为止,Stefan 的解决方案似乎是最好的答案。如果您希望将 0 与正数分组,您可以使用

        GROUP BY `field` >= 0
        

        【讨论】:

          【解决方案4】:

          试试这样的:

          select count(*), IF(foo >= 0, "pos", "neg") as sign  from test group by sign;
          

          其中 foo 是具有正值或负值的列

          编辑:如果您希望零值与正负值区别对待,Stefan 的解决方案会更加优雅和更好。

          【讨论】:

          • 我会选择 &gt;= 而不是 &gt; - (恕我直言) 零与正数比负数更自然地相关联。
          【解决方案5】:

          我知道这个问题是很久以前提出的,但它可能对将来的某人有所帮助。 注意:下面是在 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
          

          【讨论】:

            猜你喜欢
            • 2011-06-08
            • 1970-01-01
            • 2016-01-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多