在SQL中选择列值作为列标头


Select column values as column headers in SQL?

我有一个这样的表:

------------------------------------------------------
ID  |   Date   |  ClientName  |  TransactionAmount   |
------------------------------------------------------
1   |  6/16/13 |  C1          |  15                  |
------------------------------------------------------
2   |  6/16/13 |  C1          |  10                  |
------------------------------------------------------
3   |  6/16/13 |  C2          |  10                  |
------------------------------------------------------
4   |  6/17/13 |  C2          |  20                  |
------------------------------------------------------

我想得到这样的东西:

------------------------------------------------------------------------
Date    |  C1_Total_Amount_Transacted   |  C2_Total_Amount_Transacted  |
------------------------------------------------------------------------
6/16/13 |            25                 |              10              |
------------------------------------------------------------------------
6/17/13 |            0                  |              20              |

在第二个表中,如果数据库中有x个客户端,Date也是唯一的结果表将有x + 1列(1列用于日期前,x列用于每个客户端)。

可能需要编写一些PHP代码和更多的查询,任何可行的解决方案我不需要一个完整的SQL解决方案。

谢谢

我认为您对SQL相当陌生。这种类型的查询需要条件求和。并且在SQL中很容易表达:

select `date`,
       sum(case when Client_Name = 'C1' then TransactionAmount else 0 end) as C1,
       sum(case when Client_Name = 'C2' then TransactionAmount else 0 end) as C2
from t
group by `date`

但是,您必须列出查询中的每个客户端。您必须始终为SQL查询指定确切的列标头。如果您不知道它们,那么您需要将SQL创建为字符串,然后单独执行它。这是一个相当繁琐的过程。

通常可以通过使用group_concat()来解决这个问题。这将把值放在单列中,并使用您选择的分隔符(默认是逗号):

select `date`, group_concat(amount)
from (select `date`, ClientName, sum(TransactionAmount) as amount
      from t
      group by `date`, ClientName
     ) t
group by `date`