【问题标题】:Counting the count of distinct values from two columns in sql计算sql中两列的不同值的计数
【发布时间】:2019-04-26 08:58:52
【问题描述】:

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

我已经知道一种使用 union all 然后在结果表上应用 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 的唯一计数。

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

【问题讨论】:

  • 您的问题是关于 sql server 还是 bigquery?
  • 您可以提供任何解决方案。
  • 好的,我不知道 bigquery,但我看到你已经有了一个应该可以工作的答案。
  • 是的,我已经有了答案,但我想知道是否有其他方法无需取消数据透视。

标签: sql sql-server tsql google-bigquery


【解决方案1】:

我不知道 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;

【讨论】:

  • 嗨,蒂姆,您的解决方案与我的解决方案几乎相同,因为您正在做同样的事情,即加入两个表。有没有其他方法可以在不旋转列或基本上将所有值放在单个列中的情况下这样做。顺便说一句,感谢您的快速回复。
  • 如果您发现自己非常频繁或持续需要执行此查询,那么我会质疑您的数据库是否正确规范化。理想情况下,如果所有品牌只有一个列,则不需要使用联合查询。
  • @TimBiegeleisen 。 . .此查询适用于 SQL Server 和 BigQuery。我倾向于在每个数据库中编写不同的逻辑,这也是我提供答案的原因。
【解决方案2】:

在 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 是一个 dbfiddle。

在 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;

【讨论】:

  • 谢谢 正在寻找不同的方式并找到了一个。但第二种解决方案不会创建每个品牌对应每个 id 的表,因为您正在交叉应用。
  • @BrownBatman 。 . .我不明白你的评论。我已经包含了一个 BQ 查询,该查询表明它可以满足您的要求。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-10-11
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 2021-08-12
  • 2023-03-20
相关资源
最近更新 更多