2015-11-02 66 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