基于SQL中的行创建类别

时间:2016-08-29 13:54:38

标签: sql teradata categories

我有下表名为" Animal"。

Animal Drink
Dog    Water
Dog    Water
Dog    Water
Cat    Milk
Cat    Milk
Cat    Water

我正在尝试根据动物饮用的饮料类型创建类别,结果将是。

Animal Drink
Dog    Water
Cat    Mixed

我尝试了各种案例陈述,但都没有成功。问题是我正在比较行(而不是列),这对我来说已经证明是非常困难的。

基本上,我想挑出只喝水的动物。 如果一只动物只喝水,那么它就会被归类为水#34;水。如果动物喝水和其他任何东西,那么它将被归类为"混合"。如果动物不喝任何水,那么它将被分类为“不能喝水”#34;

6 个答案:

答案 0 :(得分:2)

为此,您只需按表达式使用组:

SELECT
  animal,
  CASE
    WHEN (sum_other = 0) THEN 'Water'
    WHEN (sum_water = 0) THEN 'NonWater'
    ELSE 'Mixed'
  END
FROM (SELECT
  animal,
  SUM(CASE
    WHEN (drink = 'Water') THEN 1
    ELSE 0
  END) AS sum_water,
  SUM(CASE
    WHEN (drink <> 'Water') THEN 1
    ELSE 0
  END) AS sum_other
FROM my_table
GROUP BY animal) A

答案 1 :(得分:0)

可能看起来很复杂,但我认为会工作,虽然我没有测试过:

SELECT
      A.[Animal]
    , [Drink] = IIF(A.[Cnt] > 1, 'Mixed', T.[Drink]) 
FROM
    (
    SELECT
          [Animal]
        , [Cnt] = Count(*)  
    FROM
        [Table]
    GROUP BY
          [Animal]
        , [Drink]
    ) AS A
    OUTER APPLY(
        SELECT TOP 1 
            *
        FROM
            [Table] AS T
        WHERE
            A.Animal = T.Animal
    ) AS T

答案 2 :(得分:0)

按动物计算饮料数量并使用CASE:

SELECT Animal,
CASE WHEN COUNT(DISTINCT Drink)=1
THEN Drink ELSE 'Mixed' END AS Drink
FROM T
GROUP BY Animal

答案 3 :(得分:0)

也许是这样的:


SELECT 
t.Animal
,'Mixed'
FROM #TEMP t
GROUP BY t.Animal HAVING count(DISTINCT t.Drink) > 1
UNION ALL
SELECT 
t.Animal
,(SELECT Top 1 t1.Drink FROM #TEMP t1 WHERE t1.Animal = t.Animal) 
FROM #TEMP t
GROUP BY t.Animal HAVING COUNT(DISTINCT t.Drink) = 1

答案 4 :(得分:0)

or something like this

select animal, drink from 
(select animal,
    rank() over (partition by animal order by  drink desc) as rn,
      case when rank() over (partition by animal order by  drink ) = 1
      then drink
      else 'mixed'
      end as drink
 from animal
)x
where x.rn = 1
group by 1, 2

答案 5 :(得分:0)

简易解决方案:

SELECT Animal,
CASE WHEN COUNT(DISTINCT Drink)=1
THEN 
(SELECT DISTINCT Drink from my_table where Animal = T.Animal)
 ELSE 'Mixed' END AS Drink
FROM my_table as T
GROUP BY Animal