![](/img/trans.png)
[英]How to translate SQL query in PostgreSQL to DB2. SQL SELECT query with CASE, COUNT & GROUP
[英]How to translate this SQL query into google sheets to count multiple values
我有一個包含 3 列的工作表: player_a
、 player_b
、 result
其中 player_a 和 player_b 是代表錦標賽中不同玩家的規范化字符串,結果是 'W' 或 'L'
我想創建一個包含以下數據的工作表:
player_a
, player_b
, num wins
, num losses
, winrate
如上圖所示
在 SQL,我會這樣做:
SELECT
player_a,
player_b,
num_wins, num_loss,
(num_wins*100/(num_wins+num_loss)) as winrate
FROM (
SELECT
player_a,
player_b,
count(case when result = 'W' THEN 1 END) as num_wins,
count(case when result = 'L' THEN 1 END) as num_loss
FROM `scores`
GROUP BY player_a, player_b) as grouped_scores;
在我試過的谷歌表格中:
Query(Sheet1:A3,C, "SELECT A, B, count(case when C = 'W' THEN 1 END), count(case when C = 'L' THEN 1 END)", 0)
但是計數不支持case
所以為了完成這項工作,我最終做了第一個查詢來計算勝利: Query(Sheet1:A3,C, "select A, B, count(I) where C = 'W' group by A, B label count(C) 'num wins'", 1)
然后,對於每個創建的行,我手動創建了一個num_losses
列並為下面的每個單元格添加了這個公式
=IFNA(query(Sheet1:A3,C, "select count(C) where C = 'L' AND A='"&INDIRECT("A"&row())&"' AND B='"&INDIRECT("B"&row())&"' group by A, B label count(C)''", 0), 0)
然后我還創建了一個winrate
列,我在其中為每個單元格制作了公式來計算勝率
這行得通,但我想在一個公式/查詢中完成所有這些,以使其更干凈且更易於維護。
有沒有辦法將我上面的 SQL 查詢翻譯成谷歌表格來做我描述的事情?
你可以嘗試類似的東西。
=SORT(UNIQUE(A2:B),1,1)
=ARRAYFORMULA(BYROW(E2:E&F2:F,LAMBDA(efx,if(efx="",,{COUNTA(IFERROR(FILTER(C:C,(A:A&B:B=efx)*(C:C="W")))),COUNTA(IFERROR(FILTER(C:C,(A:A&B:B=efx)*(C:C="L")))),(COUNTA(IFERROR(FILTER(C:C,(A:A&B:B=efx)*(C:C="W"))))*100)/(COUNTA(IFERROR(FILTER(C:C,(A:A&B:B=efx)*(C:C="W"))))+COUNTA(IFERROR(FILTER(C:C,(A:A&B:B=efx)*(C:C="L")))))}))))
-
給定player A
、 player B
的result
為 A1:Cx 表格,以下公式(放在一邊,例如在 E1 中)在單個公式中生成所需的數據:
=arrayformula(lambda(a,lambda(b,{split(index(b,,1),"|"),filter(b,{0,1,1,1})})(
query(if(a="",0,a),"select Col1,Col2,Col3,Col3/(Col2+Col3) label Col2 'Losses', Col3 'Wins', Col3/(Col2+Col3) 'Win rate' format Col3/(Col2+Col3) '0%'")))(
query({A1:A&"|"&B1:B,C1:C,C1:C},"select Col1,count(Col2) where Col2 is not null group by Col1 pivot Col3",1)))
NB 'Losses' 在 'Wins' 之前,因為 QUERY pivot 子句按字母順序排序 - 可以將它們翻轉過來,但這會使公式更加復雜,我認為這里的順序是一個美觀的問題。
=gsSQL("SELECT
player_a,
player_b,
num_wins, num_loss,
(num_wins*100/(num_wins+num_loss)) as winrate
FROM (
SELECT
player_a,
player_b,
sum(case when result = 'W' THEN 1 END) as num_wins,
sum(case when result = 'L' THEN 1 END) as num_loss
FROM scores
GROUP BY player_a, player_b) as grouped_scores", {{"scores", "F122:H151", 60}})
第二個參數定義表。 如果scores是工作表上的 TAB 名稱,並且第一行包含字段名稱“player_a”、“player_b”、“result” - 第二個參數不是必需的。
我的輸入數據:
玩家_a | 玩家b | 結果 |
---|---|---|
克里斯 | 弗雷德 | W |
克里斯 | 山姆 | W |
克里斯 | 威廉 | 大號 |
克里斯 | 西蒙 | W |
克里斯 | 麥克風 | W |
克里斯 | 阿方索 | W |
弗雷德 | 山姆 | 大號 |
弗雷德 | 威廉 | W |
弗雷德 | 西蒙 | W |
弗雷德 | 克里斯 | W |
弗雷德 | 麥克風 | 大號 |
威廉 | 弗雷德 | 大號 |
威廉 | 麥克風 | 大號 |
威廉 | 阿方索 | 大號 |
山姆 | 克里斯 | 大號 |
阿方索 | 克里斯 | 大號 |
山姆 | 克里斯 | 大號 |
克里斯 | 弗雷德 | 大號 |
克里斯 | 麥克風 | W |
克里斯 | 阿方索 | W |
克里斯 | 弗雷德 | 大號 |
克里斯 | 弗雷德 | 大號 |
玩家_a | 玩家b | num_wins | num_loss | 贏率 |
---|---|---|---|---|
阿方索 | 克里斯 | 0 | 1個 | 0 |
克里斯 | 阿方索 | 2個 | 0 | 100 |
克里斯 | 弗雷德 | 1個 | 3個 | 25 |
克里斯 | 麥克風 | 2個 | 0 | 100 |
克里斯 | 山姆 | 1個 | 0 | 100 |
克里斯 | 西蒙 | 1個 | 0 | 100 |
克里斯 | 威廉 | 0 | 1個 | 0 |
弗雷德 | 克里斯 | 1個 | 0 | 100 |
弗雷德 | 麥克風 | 0 | 1個 | 0 |
弗雷德 | 山姆 | 0 | 1個 | 0 |
弗雷德 | 西蒙 | 1個 | 0 | 100 |
弗雷德 | 威廉 | 1個 | 0 | 100 |
山姆 | 克里斯 | 0 | 2個 | 0 |
威廉 | 阿方索 | 0 | 1個 | 0 |
威廉 | 弗雷德 | 0 | 1個 | 0 |
威廉 | 麥克風 | 0 | 1個 | 0 |
您需要創建一個新的應用程序腳本文件並將自定義 function 復制到該文件中。 (它有 5,000 行,所以只添加一個鏈接) gsSQL 自定義 function 源
我在工作表上輸入了這個 function。 請參閱測試 Google 表格中的單元格 A122
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.