【问题标题】:n Count the difference between values in two tablesn 计算两个表中值之间的差异
【发布时间】:2014-10-22 14:19:15
【问题描述】:

我有表 PREV:

Client    Ctg
1          CC
1          OVD
2          CC
3          OVD

和表 ACT:

Client    Ctg
1          OVD
2          CC
4          OVD

我需要计算每个产品的这两个表之间的差异(有多少客户离开了产品,有多少是新客户)

所以结果应该是 CC -1 , OVD -1 new 个 OVD 1

这些结果可以在两个不同的选择中

我试过这个:

从 PREV 中选择计数 (*) left join ACT on client = client where cliet 是 Ctg 的空组

但是当一个客户有更多产品时,这不起作用...:/

请注意,有成千上万的客户,每个客户最多可以有 5 个产品 (Ctg)

每个月(ACT 和 PREV 类似于 2 月/1 月)的 Plus 是离开的客户和新的客户。在最终形式中,我也想计算新的。

【问题讨论】:

    标签: sql-server


    【解决方案1】:

    如果您想要一个表中的记录数而不是另一个表中的记录数,请在它们之间进行左/右连接并计算空值的数量。即:

    SELECT a.Ctg, a.Client PrevClient, b.Client ActClient
    FROM PREV a
    LEFT JOIN ACT b ON a.Client = b.Client AND a.Ctg = b.Ctg
    

    所以现在 ActClient 将为空,如果 PREV 表中有一条不在 ACT 表中的记录。然后,您可以通过将该 SQL 包装在另一个 SQL 语句中来简单地获取计数。浏览器

    SELECT Ctg, COUNT(*) FROM (
    SELECT a.Ctg, a.Client PrevClient, b.Client ActClient
    FROM PREV a
    LEFT JOIN ACT b ON a.Client = b.Client AND a.Ctg = b.Ctg
    ) Tmp
    WHERE ActClient IS NULL
    GROUP BY Ctg
    

    因此,要获取 ACT 中不在 PREV 中的记录计数,您可以简单地使用带有 RIGHT 连接的相同查询。并将a.Ctg 更改为b.Ctg

    【讨论】:

    • 这就是我尝试过的......我在问题中写了它,但我不能只比较客户,因为我的客户拥有不止一种产品,我需要分别计算每种产品的数量
    • 我更改了 SQL,以便您按产品分组。
    • 我明天上班试试,谢谢你的时间。
    • 哦,所以我唯一要做的就是将第二个条件添加到连接中 (ctg = ctg) ... :/ 谢谢
    【解决方案2】:

    你尝试过这样的事情吗?

    select a.ctg,a.sum2-b.sum1 from 
    (select ctg, count(*) sum2 from prev group by ctg)a,
    (select act.ctg ctg, count(*) sum1 from prev join act 
    on prev.client=act.client and prev.ctg=act.ctg group by act.ctg)b;
    

    【讨论】:

    • 我编辑了这个问题,当我只需要一个数字时,这可能会起作用 - 总差异。但我需要分别在每个类别中有所不同
    【解决方案3】:

    cte 正在计算 PREV 计数,然后与当前计数进行比较。

    ; with cte
    as
    ( select prev.Ctg, COUNT(ctg) as prevCount
      from PREV
      group by prev.Ctg
    )
    SELECT ACT.Ctg , COUNT(act.ctg) - cte.prevCount as Difference, COUNT(act.ctg) as CurrentCount, cte.prevCount as PrevCount
    from ACT
    join cte
    on act.Ctg = cte.Ctg
    group by ACT.Ctg, cte.prevCount
    

    【讨论】:

    • 但是当我这样做时,我无法识别剩下多少和新的对吗?我只会知道这两者之间的区别 - 请查看我编辑的问题
    • 将计数添加到选择列表中
    • 我明天上班试试,谢谢你的时间。
    【解决方案4】:

    基础版:

    SELECT COUNT(*) FROM [ACT] as a 
    where not exists (select * from [PREV] as p
    where a.Client = p.Client and a.Ctg = p.Ctg)
    

    好的,那就试试这个吧:

    select  a.Ctg, COUNT(a.Client) as ClientCoutThatAddThatCategory
    from ACT as a
    left outer join PREV as p
    on a.Client=p.Client and a.Ctg=p.Ctg
    where p.Client is NULL
    group by a.Ctg
    
    
    select p.Ctg, COUNT(p.Client) as ClientCoutThatLeftThatCategory
    from ACT as a
    right outer join PREV as p
    on a.Client=p.Client and a.Ctg=p.Ctg
    where a.Client is NULL
    group by p.Ctg
    

    【讨论】:

      猜你喜欢
      • 2014-07-21
      • 1970-01-01
      • 1970-01-01
      • 2020-05-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多