建筑物查询:非重复计数

Building query: Distinct count

我需要有关生成 Oracle SQL 查询的帮助...

问题是我有以下 table:

COL1  COL2  COL3
----------------
1     A     XXXX
1     B     LLLL
1     F     TTTT
5     B     GGGG
5     C     VVVV
7     D     FFFF
7     E     AAAA
7     S     SSSS

问题是我需要一个查询来显示所有列以及一个额外的列来显示不同 COL1 值的计数。

在示例中,COL1 有 3 个不同的值(1、5 和 7)

所以查询应该在额外的列中显示 3。类似于:

SELECT COL1, COL2, COL3, COUNT(DISTINCT COL1) DIFF_COUNT FROM TABLE1....


COL1  COL2  COL3  DIFF_COUNT
----------------------------
1     A     XXXX  3
1     B     LLLL  3
1     F     TTTT  3
5     B     GGGG  3
5     C     VVVV  3
7     D     FFFF  3
7     E     AAAA  3
7     S     SSSS  3

我尝试了很多方法,我知道它可能就像一个 COUNT 和相应的分组依据一样简单,但由于必须在结果中保留 COL2 和 COL3,我无法实现它。

有什么帮助吗?

提前致谢!!

根据查询的其余部分应该做什么,您可以使用子查询吗?

SELECT COL1, COL2, COL3, (SELECT DISTINCT count(COL1) FROM TABLE1) AS DIFF_COUNT FROM TABLE1....

您甚至可以使用子查询以这种方式每行生成不同的结果

您可以使用 COUNT() OVER() 分析函数以及 DISTINCT.

例如,

SQL> SELECT t1.*,
  2         COUNT(distinct col1) OVER() DIFF_COUNT
  3  FROM t1;

      COL1 C COL3 DIFF_COUNT
---------- - ---- ----------
         1 A XXXX          3
         1 B LLLL          3
         1 F TTTT          3
         5 B GGGG          3
         5 C VVVV          3
         7 D FFFF          3
         7 E AAAA          3
         7 S SSSS          3

8 rows selected.

SQL>

或者,如果不使用分析函数,您可以使用子查询作为 INLINE VIEW:

SQL> SELECT t1.*,
  2    (SELECT COUNT (*) FROM
  3      (SELECT DISTINCT col1 FROM t1
  4      )
  5    ) AS DIFF_COUNT
  6  FROM t1;

      COL1 C COL3 DIFF_COUNT
---------- - ---- ----------
         1 A XXXX          3
         1 B LLLL          3
         1 F TTTT          3
         5 B GGGG          3
         5 C VVVV          3
         7 D FFFF          3
         7 E AAAA          3
         7 S SSSS          3

8 rows selected.

SQL>
SELECT 
col1, 
col2, 
col3,       
count(col1) OVER(PARTITION BY col1 ORDER BY col1) DIFF_COUNT
FROM table_tmp;



     COL1  COL2     COL3     DIFF_COUNT
---------- -----   ----     ----------
         1 A       XXXX          3
         1 B       LLLL          3
         1 F       TTTT          3
         5 B       GGGG          2
         5 C       VVVV          2
         7 D       FFFF          3
         7 E       AAAA          3
         7 S       SSSS          3

这可能是一个糟糕的解决方案,但鉴于您还没有得到答案,我正在四处乱逛,得到了一些您想要的东西,无论如何我都会把它放在这里:

SELECT t1.*, 
  (SELECT count (*)
          FROM (SELECT DISTINCT col1
                FROM t1)
  ) AS DIFF_COUNT
FROM t1

可能有更好的解决方案,但这是我唯一能想到的 SQLFIDDLE 如果你想检查它:http://sqlfiddle.com/#!4/32578/36

最简单的方法是:

select col1, col2, col3, count(distinct col1) over() cnt from test

SQLFiddle demo