Count Distinct并提取不在Group By中的值

时间:2017-12-13 16:06:51

标签: sql hana

我试图获得一个包含额外列的完整表,其中一个计数区别于一组字段,而不是整个表。

基本上,我有这张表:

| mandt | ktopl |    yhkonto | yhhykto | yhbwkz |
|-------|-------|------------|---------|--------|
|   111 |   SAG | 0034600000 |     346 |      1 |
|   111 |   SAG | 0034600000 |     346 |     21 |
|   111 |   SAG | 0034600000 |     346 |     82 |
|   111 |   SAG | 0034600000 |     346 |     87 |
|   111 |   SAG | 0039410000 |   39410 |      1 |
|   111 |   SAG | 0039410000 |   39410 |     21 |
|   111 |   SAG | 0039410000 |   39410 |     82 |
|   111 |   SAG | 0039410000 |   39410 |     87 |
|   111 |   SAG | 0039630000 |   39630 |      1 |
|   111 |   SAG | 0039630000 |   39630 |     21 |

我希望得到这个结果,并附加一列,其中我按yhhyktomandtktopl计算yhkonto分组的不同值的计数:

| mandt | ktopl |    yhkonto | yhhykto | yhbwkz | cnt_yhhykto |
|-------|-------|------------|---------|--------|-------------|
|   111 |   SAG | 0034600000 |     346 |      1 |           1 |
|   111 |   SAG | 0034600000 |     346 |     21 |           1 |
|   111 |   SAG | 0034600000 |     346 |     82 |           1 |
|   111 |   SAG | 0034600000 |     346 |     87 |           1 |
|   111 |   SAG | 0039410000 |   39410 |      1 |           1 |
|   111 |   SAG | 0039410000 |   39410 |     21 |           1 |
|   111 |   SAG | 0039410000 |   39410 |     82 |           1 |
|   111 |   SAG | 0039410000 |   39410 |     87 |           1 |
|   111 |   SAG | 0039630000 |   39630 |      1 |           1 |
|   111 |   SAG | 0039630000 |   39630 |     21 |           1 |

我有一个有效的查询:

select distinct yh010.mandt,
                yh010.ktopl,
                yh010.yhkonto,
                yh010.yhhykto,
                yh010.yhbwkz,
                yh010_x.cnt_yhhykto
    from yh010
    inner join (
        select distinct yh010.mandt,
                        yh010.ktopl,
                        yh010.yhkonto,
                        count(distinct yh010.yhhykto) as cnt_yhhykto
            from yh010
            group by yh010.mandt, yh010.ktopl, yh010.yhkonto
    ) yh010_x
        on  yh010_x.mandt   = yh010.mandt
        and yh010_x.ktopl   = yh010.ktopl
        and yh010_x.yhkonto = yh010.yhkonto
;

但这种内部联接本身并不是最好的解决方案。或者是吗? 我的想法更像是:

select yh010.mandt,
        yh010.ktopl,
        yh010.yhkonto,
        yh010.yhhykto,
        yh010.yhbwkz
        count( distinct yh010.yhhykto 
            ) over ( group by yh010.mandt, yh010.ktopl, yh010.yhkonto 
        ) as cnt_dist
    from yh010
;

但是Incorrect syntax near the keyword 'distinct'.

我应该保留那个有效的查询还是有更好的选择?

可以找到小提琴here

谢谢!

2 个答案:

答案 0 :(得分:2)

基于此描述:

  

我想得到这个结果,得到不同值的计数   由mandt,ktopl和yhkonto分组的yhhykto

您想要此查询:

select y.mandt, y.ktopl, y.yhkonto,
       count(distinct y.yhhykto)
from yh010 y
group by y.mandt, y.ktopl, y.yhkonto;

您的实际结果和结果查询与描述不符,让我有点困惑。

答案 1 :(得分:0)

安东尼奥

请问您可以使用CTE表达式

测试以下SELECT语句
with cte as (
select
    distinct mandt, ktopl, yhkonto, yhhykto
from TBL1
)
select 
    TBL1.*, (
    select count(cte.yhhykto) 
    from cte
    where
    TBL1.mandt = cte.mandt and
    TBL1.ktopl = cte.ktopl and
    TBL1.yhkonto = cte.yhkonto
    ) as cnt
from TBL1