2013-03-15 56 views
0

我有以下表Tble添加一列:SQL查詢與特定數

 
Name | Level 
-------------- 
n1 | L1 
n1 | L2 
n2 | L1 
n2 | L3 
n3 | L1 
n4 | L3 

如何我寫一個SQL查詢,這樣的輸出?只要我想 SELECT姓名,COUNT(*)FROM Tble GROUP BY名稱

但:

 
Name | Level | CountOfDifferentLevelsForName 
------------------------------------------- 
n1 | L1  | 2 
n1 | L2  | 2 
n2 | L1  | 2 
n2 | L3  | 2 
n3 | L1  | 1 
n4 | L3  | 1 

即,例如,N1有兩個級別L1和L2

我試着做看等級也......它攪亂了計數,或不顯示所有的行

感謝

+0

感謝,這是快速的幫助! – Fab 2013-03-15 01:33:18

回答

0

有許多可能的方式來實現所需的遊結果。其中之一就是通過加入一個子查詢來分別獲取每個Name的記錄數,然後將子查詢的結果返回到表本身。

SELECT a.name, a.Level, 
     b.TotalCount 
FROM TableName a 
     INNER JOIN 
     (
      SELECT Name, Count(*) TotalCount 
      FROM TableName 
      GROUp BY Name 
     ) b ON a.Name = b.Name 

爲了更快的性能,你應該Name列定義INDEX

OUTPUT

╔══════╦═══════╦════════════╗ 
║ NAME ║ LEVEL ║ TOTALCOUNT ║ 
╠══════╬═══════╬════════════╣ 
║ n1 ║ L1 ║   2 ║ 
║ n1 ║ L2 ║   2 ║ 
║ n2 ║ L1 ║   2 ║ 
║ n2 ║ L3 ║   2 ║ 
║ n3 ║ L1 ║   1 ║ 
║ n4 ║ L3 ║   1 ║ 
╚══════╩═══════╩════════════╝ 

UPDATE 1

具有1級和該水平爲L1的名稱(即N3)

查詢:

SELECT Name 
FROM TableName 
GROUP BY Name 
HAVING COUNT(*) = 1 AND 
     MAX(Level) = 'L1' 

其具有2層,這些水平的名稱是L1和L3(即N2)

查詢:

SELECT Name 
FROM TableName 
GROUP BY Name 
HAVING COUNT(*) = 2 AND 
     SUM(CASE WHEN Level IN ('L1', 'L3') THEN 1 ELSE 0 END) = COUNT(*) 
+0

謝謝JW ...愛SQLFiddle;) – Fab 2013-03-15 01:32:47

+0

看到我的更新。希望這是你正在尋找的。 – 2013-03-15 01:56:43

+0

非常感謝!這正是我所希望的......在今天掙扎了很多時間。 – Fab 2013-03-15 02:10:56

2

...並沒有使用相關子查詢:

SELECT tb1.Name, tb1.Level, count(*) c 
FROM Tble tb1 
JOIN Tble tb2 ON tb1.Name = tb2.Name 
GROUP BY tb1.Name, tb1.Level 

確保在使用的列加入(Name)被編入索引。

1

嘗試......

select name,lvl,count(*) over (partition by name) as tot_cnt from table;