2015-11-02 68 views
0

在我的学校我们用oracle sql developer学习。 我的任务很简单。 我需要在同一列计算有多少相同的值,例如:sql - 查询而不是组

COLA COLB COLC .... 
    A  ...  ...  .... 
    A  ...  ...  .... 
    A  ...  ...  .... 
    B  ...  ...  .... 
    B  ...  ...  .... 
    C  ...  ...  .... 
    C  ...  ...  .... 
    D  ...  ...  .... 

,所以我需要的信息:有多少A的,有多少B的及。

重要的是我不能使用group by。 我可以使用的唯一的事情是:

selectfromwhereunionintersectminusdistinctcountandorasbetween

现在无法弄清楚,有什么帮助吗?

+2

目前尚不清楚你想达到什么。你能完成上面的样品表,并告诉我们你的预期产量吗? –

+0

表的其余部分是相关的,所有我需要的是我在同一列中有多少个等值的信息。 –

回答

1

所以基本上,你的问题是如何实现GROUP BY而不使用GROUP BY。

SELECT t.*, (SELECT COUNT(*) FROM tbl WHERE COLA = t.COLA) FROM (
    SELECT DISTINCT COLA FROM tbl 
) AS t 
+0

好主意。但是:'AS t'会在Oracle中导致错误 - 表格别名不支持'AS'关键字 –

+0

我给出的表仅仅作为示例,我的表是从ID构建的。所以它是一组未知的变量。我不能使用连接和子查询。 –

1

这是使用UNION的解决方案。它假定你只有字母AD

SELECT COUNT(COLA) AS theCount, 'A' as theType 
From table 
WHERE COLA = 'A' 
UNION ALL 
SELECT COUNT(COLA) AS theCount, 'B' as theType 
From table 
WHERE COLA = 'B' 
UNION ALL 
SELECT COUNT(COLA) AS theCount, 'C' as theType 
From table 
WHERE COLA = 'C' 
UNION ALL 
SELECT COUNT(COLA) AS theCount, 'D' as theType 
From table 
WHERE COLA = 'D' 

这会给你的输出表看起来像这样:

╔══════════╦═════════╗ 
║ theCount ║ theType ║ 
╠══════════╬═════════╣ 
║  3 ║ A ║ 
╠══════════╬═════════╣ 
║  2 ║ B ║ 
╠══════════╬═════════╣ 
║  2 ║ C ║ 
╠══════════╬═════════╣ 
║  1 ║ D ║ 
╚══════════╩═════════╝ 

免责声明:该解决方案是很好,如果你只有几个类型的列值。如果你有一组未知的值或大量的已知值,这不是要走的路。

+0

您应该在select子句中将''A'作为类型'移动。 –

+0

工会不会压制任何行,因为A不同于B,C等。那么为什么你不把'union all'?这是误导... –

1

我认为你正在寻找发现重复计数

SELECT 
    colA, count(colA) 
FROM myTable a 
JOIN myTable b 
ON a.colA = b.colA 
AND a.ROWID > b.ROWID 
+0

我喜欢这个答案,但他似乎没有列出'JOIN'作为一个允许的关键字。 –

+1

@TimBiegeleisen:明确的'JOIN'可以用'where'子句中的旧式隐式连接条件来代替 –

+0

@horse好点,我没有想到这一点。 –

1

所以,你只需要在不使用group by子句来算值...

select distinct cola, cnt 
from( 
    select cola, count(*) over (partition by cola) as cnt 
    from table 
    ) 

数超过分区由事情是analytic function syntax