多列上的数据透视样式计算
Pivot style calculation on multiple columns
我有一个 MySQL table 和一个用户的团队,每个用户都有一个 player1、player2 和 player3 字段。
我正在尝试计算 3 个播放器列中所有用户选择的播放器总数..
即
用户1可以选择玩家A、玩家C和玩家G。
user2 可以选择 playerE、playerF 和 playerH。
用户 3 可以选择玩家 B、玩家 A 和玩家 F。
用户4可以选择playerC, playerE & playerA.
我可以运行针对每个玩家列的声明,即
SELECT player1, count(*) as total from users;
SELECT player2, count(*) as total from users;
SELECT player3, count(*) as total from users;
问题是我需要一个包罗万象的结果集,它会显示所有选定球员的总数,所以我会得到如下所示的内容
player total
playerA 3
playerB 1
playerC 2
playerE 2
playerF 2
playerG 1
playerH 1
我的table结构如下
CREATE TABLE `leaderboard_api` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`competition_id` char(3) DEFAULT NULL,
`year` year(4) DEFAULT NULL,
`position` int(4) DEFAULT NULL,
`name` varchar(128) DEFAULT NULL,
`player1_name` varchar(128) DEFAULT NULL,
`player1_score` tinyint(11) DEFAULT NULL,
`player2_name` varchar(128) DEFAULT NULL,
`player2_score` tinyint(11) DEFAULT NULL,
`player3_name` varchar(128) DEFAULT NULL,
`player3_score` tinyint(11) DEFAULT NULL,
`total_score` tinyint(11) DEFAULT NULL,
`missed_cut` tinyint(1) DEFAULT NULL,
`withdrawn` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`id`)
);
当我运行以下
select player1_name, count(player1_name) as total from leaderboard_api where year = '2015' and competition_id = '014' group by player1_name order by total desc;
我得到了一份球员名单和他们各自的人数。然后我可以 运行 这分别用于 player2_name 和 player3_name 并得到它们的总数。
我遇到的问题是将每个查询中的每个玩家总数加到另一个查询中以获得总计。我分别有 运行 并按预期获得值。
我从@sagi 尝试了下面的解决方案,但它没有计算所有 3 个查询的总和,只给我 1 个作为总数。
SELECT t.player,count(*) FROM (
SELECT player1 as player FROM `users` UNION ALL
SELECT player2 FROM `users` UNION ALL
SELECT player3 FROM `users` UNION ALL
....) t
GROUP BY t.player
这是使用查询
的前 100 名
select id, player1_name, player2_name, player3_name from leaderboard_api limit 100;
输出:
1 Donald, Luke Toms, David Bradley, Keegan
2 Stricker, Steve Bradley, Keegan Watson, Bubba
3 Choi, KJ Westwood, Lee Bradley, Keegan
4 Scott, Adam Stricker, Steve Immelman, Trevor
5 Stricker, Steve Garcia, Sergio Haas, Bill
6 Fowler, Rickie Schwartzel, Charl Bradley, Keegan
7 Watney, Nick Stricker, Steve Levin, Spencer
8 Stricker, Steve Johnson, Zach Bradley, Keegan
9 Donald, Luke Points, DA Fowler, Rickie
10 Westwood, Lee Donald, Luke Barnes, Ricky
11 Schwartzel, Charl Choi, KJ Haas, Bill
12 Woodland, Gary Choi, KJ Garcia, Sergio
13 Donald, Luke Stricker, Steve Molder, Bryce
14 Garcia, Sergio Kuchar, Matt Furyk, Jim
15 Noh, Seung-Yul Kuchar, Matt Watney, Nick
16 Donald, Luke Mickelson, Phil Barnes, Ricky
17 Scott, Adam Fowler, Rickie Noren, Alexander
18 Johnson, Zach Molinari, Francesco Toms, David
19 Choi, KJ Westwood, Lee Poulter, Ian
20 Mcilroy, Rory Points, DA Westwood, Lee
21 McIlroy, Rory Donald, Luke Na, Kevin
22 Choi, KJ Scott, Adam Dyson, Simon
23 Fowler, Rickie Johnson, Zach Bradley, Keegan
24 Mcilroy, Rory Scott, Adam Senden, John
25 Mickelson, Phil Kuchar, Matt Barnes, Ricky
26 Jimenez, Miguel Angel Mickelson, Phil Westwood, Lee
27 Donald, Luke Mcilroy, Rory Palmer, Ryan
28 Mickelson, Phil Choi, KJ Poulter, Ian
29 Mcilroy, Rory Mickelson, Phil Points, DA
30 Johnson, Zach Stricker, Steve Molinari, Francesco
31 Toms, David Love, Davis Mickelson, Phil
32 McIlroy, Rory Westwood, Lee Wilson, Mark
33 Mcilroy, Rory Garcia, Sergio Immelman, Trevor
34 Garcia, Sergio Love, Davis Westwood, Lee
35 Donald, Luke Stricker, Steve Sabbatini, Rory
36 Mcilroy, Rory Karlsson, Robert Romero, Andres
37 Choi, KJ Yang, Y.E Toms, David
38 Mcilroy, Rory Watney, Nick Kirk, Chris
39 Mcilroy, Rory Kuchar, Matt Noren, Alexander
40 Scott, Adam Yang, Y.E Romero, Andres
41 Donald, Luke Fowler, Rickie Jimenez, Miguel Angel
42 Donald, Luke Jimenez, Miguel Angel Fowler, Rickie
43 Donald, Luke Love, Davis Choi, KJ
44 Mcilroy, Rory Westwood, Lee Barnes, Ricky
45 Donald, Luke Fowler, Rickie Molinari, Edoardo
46 Garcia, Sergio Choi, KJ Yang, Y.E
47 Choi, KJ Fowler, Rickie Dyson, Simon
48 Fowler, Rickie Molinari, Francesco Johnson, Zach
49 Stricker, Steve Choi, KJ Casey, Paul
50 McIlroy, Rory Choi, KJ Molinari, Francesco
51 Fowler, Rickie Jimenez, Miguel Angel Mickelson, Phil
52 Mcilroy, Rory Garcia, Sergio Kim, Kyung-Tae
53 Mcilroy, Rory Garcia, Sergio Kim, Kyung-Tae
54 Mcilroy, Rory Mickelson, Phil Barnes, Ricky
55 Mcilroy, Rory Mickelson, Phil Barnes, Ricky
56 Fowler, Rickie Mcilroy, Rory Wilson, Mark
57 Fowler, Rickie Love, Davis Watson, Bubba
58 Fowler, Rickie Harrington, Padraig Poulter, Ian
59 McIlroy, Rory Mickelson, Phil Jimenez, Miguel Angel
60 Mcilroy, Rory Fowler, Rickie Jimenez, Miguel Angel
61 Day, Jason Johnson, Zach Bradley, Keegan
62 Stricker, Steve Overton, Jeff Mickelson, Phil
63 Day, Jason Furyk, Jim Toms, David
64 Donald, Luke Westwood, Lee Gay, Brian
65 Stricker, Steve Day, Jason Kim, Kyung-Tae
66 Mahan, Hunter Stricker, Steve Van Pelt, Bo
67 Day, Jason Scott, Adam Barnes, Ricky
68 Day, Jason Johnson, Zach Love, Davis
69 Fowler, Rickie Jacobson, Fredrik Bradley, Keegan
70 Karlsson, Robert Watney, Nick Quiros, Alvaro
71 Schwartzel, Charl Johnson, Dustin Love, Davis
72 Mcilroy, Rory Scott, Adam Slocum, Heath
73 Day, Jason Johnson, Zach Dyson, Simon
74 Day, Jason Johnson, Zach Dyson, Simon
75 Day, Jason Mcilroy, Rory Garrigus, Robert
76 Donald, Luke Mcilroy, Rory Byrd, Jonathan
77 Baddeley, Aaron Garcia, Sergio Toms, David
78 Day, Jason Kuchar, Matt Sabbatini, Rory
79 Johnson, Dustin Choi, KJ Fisher, Ross
80 Simpson, Webb Stricker, Steve Yang, Y.E
81 Day, Jason Mickelson, Phil Barnes, Ricky
82 Johnson, Zach Howell, Charles Snedeker, Brandt
83 Donald, Luke Mcilroy, Rory Stallings, Scott
84 Kim, Anthony Mickelson, Phil Rose, Justin
85 Kaymer, Martin Marino, Steve Westwood, Lee
86 Mahan, Hunter Kaymer, Martin Poulter, Ian
87 Mcilroy, Rory Johnson, Dustin Jimenez, Miguel Angel
88 Mcilroy, Rory Johnson, Dustin Jimenez, Miguel Angel
89 Laird, Martin Scott, Adam Snedeker, Brandt
90 Johnson, Dustin Johnson, Zach Manassero, Matteo
91 Day, Jason Watney, Nick Tringale, Cameron
92 Garcia, Sergio Day, Jason Quiros, Alvaro
93 Day, Jason Moore, Ryan Toms, David
94 Day, Jason Mcilroy, Rory Barnes, Ricky
95 Baddeley, Aaron Mcilroy, Rory Yang, Y.E
96 Westwood, Lee Jacobson, Fredrik Kim, Kyung-Tae
97 Day, Jason Mcilroy, Rory Molinari, Edoardo
98 Day, Jason Garcia, Sergio Cink, Stewart
99 Bjorn, Thomas Scott, Adam Woods, Tiger
100 Day, Jason Johnson, Dustin Levin, Spencer
如果我没理解错的话,你可以使用UNION ALL
:
SELECT t.player,count(*) FROM (
SELECT player1 as player FROM `users` UNION ALL
SELECT player2 FROM `users` UNION ALL
SELECT player3 FROM `users` UNION ALL
....) t
GROUP BY t.player
编辑:我认为你的名字中有空格,所以他们没有分组为一组,试试这个:
SELECT replace(t.player,' ',''),count(*) FROM (
SELECT player1 as player FROM `users` UNION ALL
SELECT player2 FROM `users` UNION ALL
SELECT player3 FROM `users` UNION ALL
....) t
GROUP BY replace(t.player,' ','')
你也可以尝试替换这一行:
replace(t.player,' ','')
这一行:
trim(t.player)
取决于您的数据看起来如何。
在开始使用上述@sagi 的解决方案后,我最终解决了这个问题,子table 如果这是正确的语言,则计数丢失。
这是我为可能需要的人提供的解决方案...
select t.player, sum(count) as total from (
select player1_name as player, count(player1_name) as count from leaderboard_api where year = '2015' and competition_id = '033' group by player1_name
UNION
select player2_name, count(player2_name) as count from leaderboard_api where year = '2015' and competition_id = '033' group by player2_name
UNION
select player3_name, count(player3_name) as count from leaderboard_api where year = '2015' and competition_id = '033' group by player3_name)
t group by t.player order by total desc
我有一个 MySQL table 和一个用户的团队,每个用户都有一个 player1、player2 和 player3 字段。
我正在尝试计算 3 个播放器列中所有用户选择的播放器总数..
即
用户1可以选择玩家A、玩家C和玩家G。
user2 可以选择 playerE、playerF 和 playerH。
用户 3 可以选择玩家 B、玩家 A 和玩家 F。
用户4可以选择playerC, playerE & playerA.
我可以运行针对每个玩家列的声明,即
SELECT player1, count(*) as total from users;
SELECT player2, count(*) as total from users;
SELECT player3, count(*) as total from users;
问题是我需要一个包罗万象的结果集,它会显示所有选定球员的总数,所以我会得到如下所示的内容
player total
playerA 3
playerB 1
playerC 2
playerE 2
playerF 2
playerG 1
playerH 1
我的table结构如下
CREATE TABLE `leaderboard_api` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`competition_id` char(3) DEFAULT NULL,
`year` year(4) DEFAULT NULL,
`position` int(4) DEFAULT NULL,
`name` varchar(128) DEFAULT NULL,
`player1_name` varchar(128) DEFAULT NULL,
`player1_score` tinyint(11) DEFAULT NULL,
`player2_name` varchar(128) DEFAULT NULL,
`player2_score` tinyint(11) DEFAULT NULL,
`player3_name` varchar(128) DEFAULT NULL,
`player3_score` tinyint(11) DEFAULT NULL,
`total_score` tinyint(11) DEFAULT NULL,
`missed_cut` tinyint(1) DEFAULT NULL,
`withdrawn` tinyint(1) DEFAULT NULL,
PRIMARY KEY (`id`)
);
当我运行以下
select player1_name, count(player1_name) as total from leaderboard_api where year = '2015' and competition_id = '014' group by player1_name order by total desc;
我得到了一份球员名单和他们各自的人数。然后我可以 运行 这分别用于 player2_name 和 player3_name 并得到它们的总数。
我遇到的问题是将每个查询中的每个玩家总数加到另一个查询中以获得总计。我分别有 运行 并按预期获得值。
我从@sagi 尝试了下面的解决方案,但它没有计算所有 3 个查询的总和,只给我 1 个作为总数。
SELECT t.player,count(*) FROM (
SELECT player1 as player FROM `users` UNION ALL
SELECT player2 FROM `users` UNION ALL
SELECT player3 FROM `users` UNION ALL
....) t
GROUP BY t.player
这是使用查询
的前 100 名select id, player1_name, player2_name, player3_name from leaderboard_api limit 100;
输出:
1 Donald, Luke Toms, David Bradley, Keegan
2 Stricker, Steve Bradley, Keegan Watson, Bubba
3 Choi, KJ Westwood, Lee Bradley, Keegan
4 Scott, Adam Stricker, Steve Immelman, Trevor
5 Stricker, Steve Garcia, Sergio Haas, Bill
6 Fowler, Rickie Schwartzel, Charl Bradley, Keegan
7 Watney, Nick Stricker, Steve Levin, Spencer
8 Stricker, Steve Johnson, Zach Bradley, Keegan
9 Donald, Luke Points, DA Fowler, Rickie
10 Westwood, Lee Donald, Luke Barnes, Ricky
11 Schwartzel, Charl Choi, KJ Haas, Bill
12 Woodland, Gary Choi, KJ Garcia, Sergio
13 Donald, Luke Stricker, Steve Molder, Bryce
14 Garcia, Sergio Kuchar, Matt Furyk, Jim
15 Noh, Seung-Yul Kuchar, Matt Watney, Nick
16 Donald, Luke Mickelson, Phil Barnes, Ricky
17 Scott, Adam Fowler, Rickie Noren, Alexander
18 Johnson, Zach Molinari, Francesco Toms, David
19 Choi, KJ Westwood, Lee Poulter, Ian
20 Mcilroy, Rory Points, DA Westwood, Lee
21 McIlroy, Rory Donald, Luke Na, Kevin
22 Choi, KJ Scott, Adam Dyson, Simon
23 Fowler, Rickie Johnson, Zach Bradley, Keegan
24 Mcilroy, Rory Scott, Adam Senden, John
25 Mickelson, Phil Kuchar, Matt Barnes, Ricky
26 Jimenez, Miguel Angel Mickelson, Phil Westwood, Lee
27 Donald, Luke Mcilroy, Rory Palmer, Ryan
28 Mickelson, Phil Choi, KJ Poulter, Ian
29 Mcilroy, Rory Mickelson, Phil Points, DA
30 Johnson, Zach Stricker, Steve Molinari, Francesco
31 Toms, David Love, Davis Mickelson, Phil
32 McIlroy, Rory Westwood, Lee Wilson, Mark
33 Mcilroy, Rory Garcia, Sergio Immelman, Trevor
34 Garcia, Sergio Love, Davis Westwood, Lee
35 Donald, Luke Stricker, Steve Sabbatini, Rory
36 Mcilroy, Rory Karlsson, Robert Romero, Andres
37 Choi, KJ Yang, Y.E Toms, David
38 Mcilroy, Rory Watney, Nick Kirk, Chris
39 Mcilroy, Rory Kuchar, Matt Noren, Alexander
40 Scott, Adam Yang, Y.E Romero, Andres
41 Donald, Luke Fowler, Rickie Jimenez, Miguel Angel
42 Donald, Luke Jimenez, Miguel Angel Fowler, Rickie
43 Donald, Luke Love, Davis Choi, KJ
44 Mcilroy, Rory Westwood, Lee Barnes, Ricky
45 Donald, Luke Fowler, Rickie Molinari, Edoardo
46 Garcia, Sergio Choi, KJ Yang, Y.E
47 Choi, KJ Fowler, Rickie Dyson, Simon
48 Fowler, Rickie Molinari, Francesco Johnson, Zach
49 Stricker, Steve Choi, KJ Casey, Paul
50 McIlroy, Rory Choi, KJ Molinari, Francesco
51 Fowler, Rickie Jimenez, Miguel Angel Mickelson, Phil
52 Mcilroy, Rory Garcia, Sergio Kim, Kyung-Tae
53 Mcilroy, Rory Garcia, Sergio Kim, Kyung-Tae
54 Mcilroy, Rory Mickelson, Phil Barnes, Ricky
55 Mcilroy, Rory Mickelson, Phil Barnes, Ricky
56 Fowler, Rickie Mcilroy, Rory Wilson, Mark
57 Fowler, Rickie Love, Davis Watson, Bubba
58 Fowler, Rickie Harrington, Padraig Poulter, Ian
59 McIlroy, Rory Mickelson, Phil Jimenez, Miguel Angel
60 Mcilroy, Rory Fowler, Rickie Jimenez, Miguel Angel
61 Day, Jason Johnson, Zach Bradley, Keegan
62 Stricker, Steve Overton, Jeff Mickelson, Phil
63 Day, Jason Furyk, Jim Toms, David
64 Donald, Luke Westwood, Lee Gay, Brian
65 Stricker, Steve Day, Jason Kim, Kyung-Tae
66 Mahan, Hunter Stricker, Steve Van Pelt, Bo
67 Day, Jason Scott, Adam Barnes, Ricky
68 Day, Jason Johnson, Zach Love, Davis
69 Fowler, Rickie Jacobson, Fredrik Bradley, Keegan
70 Karlsson, Robert Watney, Nick Quiros, Alvaro
71 Schwartzel, Charl Johnson, Dustin Love, Davis
72 Mcilroy, Rory Scott, Adam Slocum, Heath
73 Day, Jason Johnson, Zach Dyson, Simon
74 Day, Jason Johnson, Zach Dyson, Simon
75 Day, Jason Mcilroy, Rory Garrigus, Robert
76 Donald, Luke Mcilroy, Rory Byrd, Jonathan
77 Baddeley, Aaron Garcia, Sergio Toms, David
78 Day, Jason Kuchar, Matt Sabbatini, Rory
79 Johnson, Dustin Choi, KJ Fisher, Ross
80 Simpson, Webb Stricker, Steve Yang, Y.E
81 Day, Jason Mickelson, Phil Barnes, Ricky
82 Johnson, Zach Howell, Charles Snedeker, Brandt
83 Donald, Luke Mcilroy, Rory Stallings, Scott
84 Kim, Anthony Mickelson, Phil Rose, Justin
85 Kaymer, Martin Marino, Steve Westwood, Lee
86 Mahan, Hunter Kaymer, Martin Poulter, Ian
87 Mcilroy, Rory Johnson, Dustin Jimenez, Miguel Angel
88 Mcilroy, Rory Johnson, Dustin Jimenez, Miguel Angel
89 Laird, Martin Scott, Adam Snedeker, Brandt
90 Johnson, Dustin Johnson, Zach Manassero, Matteo
91 Day, Jason Watney, Nick Tringale, Cameron
92 Garcia, Sergio Day, Jason Quiros, Alvaro
93 Day, Jason Moore, Ryan Toms, David
94 Day, Jason Mcilroy, Rory Barnes, Ricky
95 Baddeley, Aaron Mcilroy, Rory Yang, Y.E
96 Westwood, Lee Jacobson, Fredrik Kim, Kyung-Tae
97 Day, Jason Mcilroy, Rory Molinari, Edoardo
98 Day, Jason Garcia, Sergio Cink, Stewart
99 Bjorn, Thomas Scott, Adam Woods, Tiger
100 Day, Jason Johnson, Dustin Levin, Spencer
如果我没理解错的话,你可以使用UNION ALL
:
SELECT t.player,count(*) FROM (
SELECT player1 as player FROM `users` UNION ALL
SELECT player2 FROM `users` UNION ALL
SELECT player3 FROM `users` UNION ALL
....) t
GROUP BY t.player
编辑:我认为你的名字中有空格,所以他们没有分组为一组,试试这个:
SELECT replace(t.player,' ',''),count(*) FROM (
SELECT player1 as player FROM `users` UNION ALL
SELECT player2 FROM `users` UNION ALL
SELECT player3 FROM `users` UNION ALL
....) t
GROUP BY replace(t.player,' ','')
你也可以尝试替换这一行:
replace(t.player,' ','')
这一行:
trim(t.player)
取决于您的数据看起来如何。
在开始使用上述@sagi 的解决方案后,我最终解决了这个问题,子table 如果这是正确的语言,则计数丢失。
这是我为可能需要的人提供的解决方案...
select t.player, sum(count) as total from (
select player1_name as player, count(player1_name) as count from leaderboard_api where year = '2015' and competition_id = '033' group by player1_name
UNION
select player2_name, count(player2_name) as count from leaderboard_api where year = '2015' and competition_id = '033' group by player2_name
UNION
select player3_name, count(player3_name) as count from leaderboard_api where year = '2015' and competition_id = '033' group by player3_name)
t group by t.player order by total desc