sql中的一个列条件

时间:2014-07-03 11:55:01

标签: sql aggregate-functions

我有一张桌子:

[letter] [Name]  [status]  [price]
      A    row1       1        11
      A    row1       1        15
      B    row2       2         9
      B    row2       3        23
      B    row2       3        30

想要选择这样的数据:

 SELECT letter, Name, 
    COUNT(*),
    CASE WHEN price>10 THEN COUNT(*) ELSE NULL END
    GROUP BY letter, Name

结果是:

 A    row1     2      2 
 B    row2     1      null 
 B    row2     2      2 

但我想要这种格式:

 A    row1      2     2 
 B    row2      3     2

请帮我修改我的查询

3 个答案:

答案 0 :(得分:6)

关闭。可能想要这个:

SELECT letter, Name, 
  COUNT(*),
  SUM(CASE WHEN price>10 THEN 1 ELSE 0 END)
FROM TableThatShouldHaveAppearedInTheQuestionInTheFromClause
GROUP BY letter, Name

应该有效。假设第四列的意图是返回每组内行数的计数,price大于10。也可以COUNT()CASE执行此操作,然后返回非NULLNULL结果,以查找应该和不应该计算的行数,但我发现上面的表格更容易快速推理。

答案 1 :(得分:1)

由于在聚合函数中不使用空值:

SELECT letter
     , name
     , count(*)
     , count(
         case when price > 10 then 1 
         end
       ) 
  FROM t
 GROUP BY letter, name

你非常接近。

答案 2 :(得分:0)

看看其他答案,可能这不是最好的方法,但它会起作用。 超过10的价格计数是使用子查询进行的,该子查询的条件为price > 10,并且已加入当前TAB条记录,并且别名为A letter }和name

SELECT letter, 
       Name, 
       COUNT(*),
       (SELECT COUNT(*) FROM TAB WHERE letter = A.letter and Name = A.Name WHERE price>10)
FROM TAB A
GROUP BY letter, Name