构建查询:不同的计数

时间:2015-05-21 06:56:30

标签: sql oracle count group-by

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

问题是我有下表:

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

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

在示例中,我们为COL1(1,5和7)提供了3个不同的值

因此查询应在额外列中显示3。类似的东西:

{{1}}

我已经尝试了很多方法,我知道它可能就像COUNT一样简单,但是由于需要在结果中保留COL2和COL3,所以我无法实现它。

有任何帮助吗?

提前多多感谢!!

5 个答案:

答案 0 :(得分:2)

最简单的方法是:

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

SQLFiddle demo

答案 1 :(得分:1)

您可以使用 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>

答案 2 :(得分:0)

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

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

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

这可能是一个糟糕的解决方案,但看到你还没有得到答案,我正在搞乱并得到了一些你想要的东西我会把它放在这里:

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

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