2011-06-26 34 views
4

我正在使用一個sqlite3數據庫,這樣的表。SQL組由一列,在另一個計數條目

|name |action  | 
------------------------- 
|john |run  | 
|jim |run  | 
|john |run  | 
|john |jump  | 
|jim |jump  | 
|jim |jump  | 
|jim |dive  | 

我希望得到一個輸出這樣

|name |run |jump |dive | 
--------------------------------- 
|john |2 |1 |0 | 
|jim |1 |2 |1 | 

我來最接近的是這一點,但我想有一排像上面。

SELECT name, action, COUNT(name) 
FROM table 
GROUP BY name, action 

|name |action |COUNT(name) | 
|john |run |2  | 
|john |jump |1  | 
|jim |run |1  | 
|jim |jump |2  | 
|jim |dive |1  | 

此外,我還需要在查詢中有一些WHERE語句。

我在黑夜認爲這會工作嗎?

+2

你所尋找的是我認爲數據透視表。我在[msdn]上找到了這個例子(http://blogs.msdn.com/b/spike/archive/2009/03/03/pivot-tables-in-sql-server-a-simple-sample.aspx) –

+0

是的,他需要PIVOT數據,但是在sqlite中沒有簡單的方法,因爲沒有像SQL Server那樣的PIVOT或UNPIVOT運算符。 –

回答

1

你正在做的事叫做cross tabulation。通常這可以在Excel和其他電子表格軟件中作爲一個稱爲數據透視表的功能來使用。

我發現了一篇博客文章,它將幫助你使用SQL。退房pivot-table-hack-in-sqlite3-and-mysql

+0

嘿mridkash,這正是我想要的,謝謝你的鏈接和信息(教導一個人釣魚和所有這些)。測試表明,這也執行得更快。 – valentine

+0

@valentine不客氣。 –

1

我不知道SQLLite那麼好,但我認爲你可以使用子查詢或臨時表。 隨着MSSQL你可以寫這樣的事情:

select Name, 
    (select count(*) from table as t1 where t1.Name = table.Name and t1.Action = 'run') as Run, 
(select count(*) from table as t1 where t1.Name = table.Name and t1.Action = 'dive') as dive, 
(select count(*) from table as t1 where t1.Name = table.Name and t1.Action = 'jump') as run 
from table 

但是,這需要你每次廣告其他操作類型被改寫。您應該添加一個索引來加快桌面上的速度。但請先查看「真實」數據的查詢計劃。

+0

謝謝理查 這工作得很好。 我意識到架構是完全有缺陷的,但我採取了csv並在內存中創建一個sqlite數據庫,然後使用它來進行查詢。所以我在一定程度上限制了不得不做靜態文本條目。 – valentine

2

您也可以完成你想要的使用和骨料和情況的條件是這樣的:

SELECT name, 
     sum(CASE WHEN action = 'run' THEN 1 END) as run, 
     sum(CASE WHEN action = 'jump' THEN 1 END) as jump, 
     sum(CASE WHEN action = 'dive' THEN 1 END) as dive 
FROM table 
GROUP BY name 

你仍然有充分的添加額外的動作時間更改查詢。

0

在Oracle數據庫中,你可以像下面的查詢寫到顯示所需的解決方案: -

select * from table_name 
pivot (count(*) for action in ('run','jump','drive')) 

這將給所需的輸出..

相關問題