我有下表名为" Animal"。
Animal Drink
Dog Water
Dog Water
Dog Water
Cat Milk
Cat Milk
Cat Water
我正在尝试根据动物饮用的饮料类型创建类别,结果将是。
Animal Drink
Dog Water
Cat Mixed
我尝试了各种案例陈述,但都没有成功。问题是我正在比较行(而不是列),这对我来说已经证明是非常困难的。
基本上,我想挑出只喝水的动物。 如果一只动物只喝水,那么它就会被归类为水#34;水。如果动物喝水和其他任何东西,那么它将被归类为"混合"。如果动物不喝任何水,那么它将被分类为“不能喝水”#34;
答案 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