【问题标题】:A Column to count number of distinct values in column X based on column Y?根据列 Y 计算列 X 中不同值的数量的列?
【发布时间】:2017-06-07 21:35:27
【问题描述】:

在 SSMS 2016 中,我有一个带有各种连接的 select 语句,它为我提供了以下数据:

| box_barcode | order_number | order_shipment_id | item     | qty |
|-------------|--------------|-------------------|----------|-----|
|  3330000001 | 0000105      | FP001             | tshirt-S | 1   |
|  3330000001 | 0000105      | FP001             | tshirt-M | 2   |
|  3330000001 | 0000105      | FP001             | tshirt-L | 2   |
|  3330000005 | 0000108      | FP002             | shorts-S | 2   |
|  3330000005 | 0000108      | FP002             | shorts-M | 1   |
|  3330000005 | 0000120      | FP002             | shorts-S | 1   |
|  3330000010 | 0000120      | FP003             | shirts-M | 2   |
|  3330000010 | 0000120      | FP003             | shirts-L | 2   |
|  3330000010 | 0000121      | FP003             | shirts-S | 3   |
|  3330000010 | 0000121      | FP003             | shirts-M | 3   |
|  3330000010 | 0000122      | FP003             | shirts-S | 2   |

我想添加一列来计算每个 box_barcode 的不同 order_numbers 的数量,以获得所需的结果:

| box_barcode | order_number | order_shipment_id | item     | qty | count |
|-------------|--------------|-------------------|----------|-----|-------|
|  3330000001 | 0000105      | FP001             | tshirt-S | 1   | 1
|  3330000001 | 0000105      | FP001             | tshirt-M | 2   | 1
|  3330000001 | 0000105      | FP001             | tshirt-L | 2   | 1
|  3330000005 | 0000108      | FP002             | shorts-S | 2   | 2
|  3330000005 | 0000108      | FP002             | shorts-M | 1   | 2
|  3330000005 | 0000120      | FP002             | shorts-S | 1   | 2
|  3330000010 | 0000120      | FP003             | shirts-M | 2   | 3
|  3330000010 | 0000120      | FP003             | shirts-L | 2   | 3
|  3330000010 | 0000121      | FP003             | shirts-S | 3   | 3
|  3330000010 | 0000121      | FP003             | shirts-M | 3   | 3
|  3330000010 | 0000122      | FP003             | shirts-S | 2   | 3

我正在努力寻找如何最好地实现这一目标。我知道 count(distinct..),但我是否必须将当前查询放入子查询中,以便计数首先与该查询的结果相反?

【问题讨论】:

  • yes..获取每个 box_barcode 的计数并将其与表格连接。您可以使用count 窗口函数来完成它。但它不支持distinct
  • 我会使用公用表表达式来计算每个 box_barcode 的不同订单号的数量,然后将您的 CTE 加入您的查询并将该值显示为 SELECT 语句中的参数。如果您将整个查询与一堆连接到一个视图中,那么它看起来会更整洁一些。

标签: sql sql-server ssms ssms-2016


【解决方案1】:

dense_rankmax 的另一个选项。

select t.*,
       max(rnk) over(partition by box_barcode) as distinct_count
from (select t.*,
      dense_rank() over(partition by box_barcode order by order_numbers) as rnk
      from t
     ) t

排名最高的行(使用dense_rank)将是每个box_barcode的不同订单号数。

【讨论】:

    【解决方案2】:

    唉,SQL Server 不支持将count(distinct) 作为窗口函数。但它很容易模仿:

    select t.*,
           sum(case when seqnum = 1 then 1 else 0 end) over (partition by box_barcode) as distinct_count
    from (select t.*,
                 row_number() over (partition by box_barcode, order_numbers order by box_barcode) as seqnum
          from t
         ) t;
    

    【讨论】:

    • 你一定忘记了sum中的over子句。
    • @vkp 。 . .谢谢。
    猜你喜欢
    • 1970-01-01
    • 2020-08-23
    • 2019-03-09
    • 2014-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-09
    相关资源
    最近更新 更多