2016-10-11 63 views
1

搜索本網站,但沒有看到任何類似和幫助的線程。SQL「獨特」和分組條款

例子:我有一個數據如下

Col1  Col2 
aaaa  1111 
aaaa  2222 
bbbb  4444 
bbbb  3333 

我如何可以查詢到有一個表像下面?

Col1  Col2 
aaaa  1111 
      2222 
bbbb  4444 
      3333 

我的當前查詢來測試此目的

SELECT Col1,Col2 FROM msaEPGerror 
FROM Table1 
GROUP BY Col1,Col2 

使用不同的和組由試過了,但它仍顯示以及其他數據。是的,我的數據庫包含了數十萬行。 這可能嗎?我只是試圖運氣,因爲以前我使用Report Builder設計了一些東西,但現在正嘗試將其遷移到SQL。

感謝

+1

解釋你預期的結果更多。 Col1中有NULL?你在哪裏期待NULL,因爲Col2似乎沒有被排序。 –

+0

SQL不能與在報告生成器中合併單元格的顯示器相同。 – qxg

+0

試試這個在應用層 –

回答

2

通過下面的查詢使用COL2爲了將工作:

select case rank when 1 then col1 else '' end as col1, col2 
from (select col1,col2, 
     rank() over (partition by col1 order by col2) as rank 
    from table1) tab; 
+0

問題是預期的查詢結果不被COL2有序 - 你可以看到,「AAAA」有「1111」的價值,但對於BBBB有「4444」而不是「3333」 –

+0

嗨@Gaurav感謝您幫助,我確切地使用您的查詢,結果仍然顯示在列1中重複相同的數據... 確切地說,col1是日期,col2是人..我需要知道誰今天工作,讓我說10人,我需要它顯示只有一個日期(這是今天)和列表10人,但我的問題仍然顯示10same日期和10人,可能嗎? – Sap1

+0

@ Sap1,也許你的日期也顯​​示時間組件,因此它們在分區子句中被視爲不同的值。嘗試按trunc(col1)按col2排序分區。 –

2

使用以下查詢,它會爲特定列返回一個值:

SELECT CASE WHEN t.id = (SELECT TOP 1 t2.id FROM Table t2 
WHERE t2.Col1 = t.Col1 
GROUP BY t2.Col1) THEN t.Col1 
ELSE 
'' 
END AS Col1, t.Col2 
FROM Table t 

我想,表格有一個主鍵。

2

首先:你不希望使用GROUP BY,因爲這是你的彙總數據,如只有每一個COL1結果行。

那麼你不想使用DISTINCT要麼,因爲這消除了重複行。您的表格不包含重複的行。

你真正想要做的是顯示您的數據時,抑制重複值。你必須在這裏做出選擇:要麼在你的GUI中(在你編寫的程序或者在報表引擎中)這樣做,這將是最常見的方式。或者使用SQL查看以前的記錄。執行此操作的功能是LAG

select 
    col1, 
    case when t.col1 = lag(t.col1) over (order by t.col1, t.col2) then null else col1 end 
    as col2 
from table1 t 
order by t.col1, t.col2; 
+0

你的回答和解釋非常棒,LAG功能真的讓我知道我在找什麼...是的我知道我應該將這個應用於報告引擎,但似乎你已經更清楚了,我想我可以達到我的觀點這......謝謝!感謝所有幫助! :) – Sap1