背景
我有一個SQLite表,d,它看起來像這樣:
-- - ------------ ------------
|id|sex|event_type_1|event_type_2|
-- --- ------------ ------------
|a |m |1 |1 |
|b |f |0 |1 |
|c |f |1 |0 |
|d |m |0 |1 |
-- --- ------------ ------------
問題
我試圖寫一個查詢,產生以下event_type_1和event_type_2的計數摘要,按sex切割(分組?
------------- ----- ----- >
| | m | f |
------------- ----- -----
|event_type_1 | 1 | 1 |
------------- ----- -----
|event_type_2 | 2 | 1 |
------------- ----- -----
這似乎涉及到將2個event_type列移位到查詢結果的行中,作為一個SQL新手,我并不熟悉這種做法。
我所做的嘗試
到目前為止,我想出了以下的查詢方式:
我已經試過了。
但這只給了我這樣的結果: 在另一個類似的帖子中,我問如何在PostgreSQL中做到這一點,Gordon Linoff給了我一個答案,這個答案很有效: 但我的需求發生了變化,我需要在SQLite中完成這一作業。我一直在嘗試使用橫向連接將這段代碼改編為 SQLite,但沒有任何收獲。
uj5u.com熱心網友回復: 或者,如果你能在你呼叫的編程語言中對行/列進行轉置,而不是在SQL中進行,你可以直接使用: uj5u.com熱心網友回復: 在SQLite中,有各種方法。 其中一種方法是使用 使用
標籤:SELECT event_type_1, event_type_2, count(sex
FROM d
group by event_type_1, event_type_2
------------ -----
|event_type_1|event_type_2|count|
------------ ------------ -----
|1 |1 |1 |
|1 |0 |1 |
|0 |1 |2 |
------------ ------------ -----
select v.which,
count(*) filter (whered. sex = 'm'/span>) as m,
count(*) filter (where d. sex = 'f'/span>) as f
from d cross joinlateral
(values (d.event_type_2, 'event_type_2') 。
(d.event_type_1, 'event_type_1')
) v(val, which)
where v.val =1
group by v.which", drv = "SQLite" )
SELECT 'event_type_1' AS event_type。SUM(sex='m') as m, SUM(sex='f') AS. keyword">AS f FROM d WHERE event_type_1
UNION[/span]。
SELECT 'event_type_2' AS event_type。SUM(sex='m') as m, SUM(sex='f') AS. keyword">AS f FROM d WHERE event_type_2
SELECT sex, SUM(event_type_1)。SUM(event_type_2) FROM d GROUP by sex
交叉連接:select which,
sum(sex = 'm'/span>) as m,
sum(sex = 'f') as f
from d crossjoin
(select 'event_type_1' as which union all select 'event_type_2' as which) v
group by which;
CROSS JOIN的好處是,原始表只被掃描一次。
