簡體   English   中英

如何將此 SQL 查詢翻譯成谷歌表格以計算多個值

[英]How to translate this SQL query into google sheets to count multiple values

我有一個包含 3 列的工作表: player_aplayer_bresult其中 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 查詢翻譯成谷歌表格來做我描述的事情?

你可以嘗試類似的東西。

  • A、B、C 列有原始數據
  • 單元格 E2 中的公式: =SORT(UNIQUE(A2:B),1,1)
  • G2單元格中的公式:

=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 Aplayer Bresult為 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 子句按字母順序排序 - 可以將它們翻轉過來,但這會使公式更加復雜,我認為這里的順序是一個美觀的問題。

  • 我使用我編寫的工作表自定義 function 來執行我的 SQL SELECT 查詢。 我稍微修改了它,以便它可以與我的 function 一起運行。
=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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM