2009-11-18 22 views
2

我在尋找的是將同一個表中的不同數據進行分組並計數,並將它們顯示在兩個不同的列中。如下所示。在列中計數值

數據表A

領域:從查詢

Name Type 
Bob 1 
John 2 
Bob 1 
Steve 1 
John 1 
Bob 2 

期望的結果:

Name Type 1 Type 2 
Bob 2  1 
John 1  1 
Steve 1  0 
+1

哎呀,我認爲這將取決於RDMS;不確定它可以在ANSI SQL中完成。這是哪個數據庫? –

回答

7

這將做在SQL Server的伎倆:

SELECT 
    name, 
    SUM(CASE type WHEN 1 THEN 1 ELSE 0 END) AS type1, 
    SUM(CASE type WHEN 2 THEN 1 ELSE 0 END) AS type2 
FROM 
    myTable 
GROUP BY 
    name 
+0

非常符合我寫的內容。 – ale

+0

在SQL Server中,您將使用CASE ... END語句,但沒有IF()語法。 –

+0

感謝Philip,在Adam指定RDBMS之前,我寫了它。 – Seb

0

@Seb有一個很好的解決方案,但它是依賴於服務器。下面是一個使用子查詢,應該是便攜式備用:

select 
    name, 
    (select count(type) from myTable where type=1 and name=a.name) as type1, 
    (select count(type) from myTable where type=2 and name=a.name) as type2 
from 
    myTable as a 
group by 
    name 
0

使用兩個單獨的GROUP BY子查詢。

SELECT Name, a.Count1, b.Count2 
from myTable 
JOIN 
    (SELECT Name, SUM(Type) AS Count1 FROM myTable GROUP BY Name WHERE Type=1) AS a ON a.Name = myTable.Name 
    (SELECT Name, SUM(Type) FROM myTable GROUP BY Name WHERE Type=2) AS b ON b.Name = myTable.Name 
2

沒時間寫代碼,但Case語句就是你想要的。如果它滿足要求,那麼它的值爲1,如果不滿足則爲零。然後你可以對列進行求和。

0

你正在尋找一個交叉的解決方案。上述解決方案可以工作,但如果你想要一個通用的解決方案並且有N種類型的話你就會陷入僵局。

CrossTab解決方案將爲您解決這個問題。如果這是爲了快速處理一些數字,那麼將數據轉儲到Excel中並使用本機數據透視表功能。

如果是針對應用程序中的RDBMS,則它取決於RDBMS。 MS SQL 2005及更高版本具有交叉表語法。見:

http://www.databasejournal.com/features/mssql/article.php/3521101/Cross-Tab-reports-in-SQL-Server-2005.htm