SQL动态压缩

时间:2017-10-26 11:01:28

标签: mysql sql

我正在尝试制作动态查询以压缩查询结果并加快我们其中一个网站的效果。

这个表给出了一个问题(从大型字段集中缩小):

======================================
|   id  | team_id | game_no | result |
--------------------------------------
|  1012 |    1    |   1     |   178  |
|  1132 |    1    |   2     |   122  |
|  1514 |    1    |   3     |   166  |
|  1519 |    2    |   1     |   155  |
|  1761 |    2    |   2     |   111  |
|  2030 |    2    |   3     |   222  |
|  2037 |    2    |   4     |   225  |
======================================

我需要构造一个产生以下输出的SQL查询:

RESULT:
=======================================================
| team_id | game_1 | game_2 | game_3 | game_4 | total |
|    1    |   178  |   122  |   166  |    0   |  466  |
|    2    |   155  |   111  |   222  |   225  |  713  |
=======================================================

但是,游戏数量根据数据库中另一个表中的另一个字段动态变化,可能并不总是有4个游戏可能有8个或10个。

这可能吗?

修改

我忘了说!该站点是基于PHP的WebApp,很高兴集成以实现解决方案!

1 个答案:

答案 0 :(得分:1)

这是在sql server中使用tsql的答案。我知道你正在使用mysql,但它应该给出一个想法,并且应该在mysql过程语言中等效(我假设有一个)。下面的TSQL代码生成以下sql并执行它

select teamid,
       sum(CASE WHEN gameno=1 then result else 0 end) g_1 ,
       sum(CASE WHEN gameno=2 then result else 0 end) g_2 ,
       sum(CASE WHEN gameno=3 then result else 0 end) g_3 ,
       sum(CASE WHEN gameno=4 then result else 0 end) g_4 ,
       sum(result) total 
 from #ab 
 group by teamid

这是tsql代码,需要运行才能进行动态查询

declare @l_sql varchar(4000)= 'select teamid'
declare @l_gameno int

DECLARE l_cursor CURSOR 
FOR
  select distinct gameno from #ab order by 1
OPEN l_cursor
FETCH NEXT FROM l_cursor INTO @l_gameno
WHILE @@FETCH_STATUS = 0
BEGIN
   set @l_sql = @l_sql + ',sum(CASE WHEN gameno='+cast(@l_gameno as varchar)+' then result else 0 end) g_'+cast(@l_gameno as varchar)+' ' 
   FETCH NEXT FROM l_cursor INTO @l_gameno
end 
CLOSE l_cursor
DEALLOCATE l_cursor
set @l_sql = @l_sql + ',sum(result) total from #ab group by teamid'
exec (@l_sql)