计算来自SQL中两列的不同值的计数

时间:2019-04-26 08:58:53

标签: sql sql-server tsql google-bigquery

我在数据库中有一个表,其中有对应的主键值。 我想计算两列中的不同值。

我已经知道一种使用并集所有然后在结果表上应用groupby的方法。

Select Id,Brand1
into #Temp
from data
union all
Select Id,Brand2
from data

Select ID,Count(Distinct Brand1)
from #Temp
group by ID

我们也可以只使用临时表在大型查询中完成同样的事情。

样品表

ID  Brand1  Brand2
1    A       B
1    B       C
2    D       A
2    A       D

结果表

ID  Distinct_Count_Brand
1    3
2    2

在此列中您可以看到Distinct_count_Brand它从两个列Brand1和Brand2中计算Brand的唯一计数。

我已经知道一种方法(基本上是不可透视的),但是想知道是否还有其他方法可以对两列中的唯一值进行计数。

2 个答案:

答案 0 :(得分:3)

我不知道BigQuery的怪癖,但也许您可以内联联合查询:

SELECT ID, COUNT(DISTINCT Brand)
FROM
(
    SELECT ID, Brand1 AS Brand FROM data
    UNION ALL
    SELECT ID, Brand2 FROM data
) t
GROUP BY ID;

答案 1 :(得分:1)

在SQL Server中,我将使用:

Select b.id, count(distinct b.brand)
from data d cross apply
     (values (id, brand1), (id, brand2)) b(id, brand)
group by b.id;

Here是db <>小提琴。

在BigQuery中,等效项表示为:

select t.id, count(distinct brand)
from t cross join
     unnest(array[brand1, brand2]) brand
group by t.id;

这是一个BQ查询,证明它可以工作:

with t as (
      select 1 as id, 'A' as brand1, 'B' as brand2 union all
      select 1, 'B', 'C' union all
      select 2, 'D', 'A' union all
      select 2, 'A', 'D'
     )
select t.id, count(distinct brand)
from t cross join
     unnest(array[brand1, brand2]) brand
group by t.id;
相关问题