【问题标题】:display multi columns from the one table显示一个表中的多列
【发布时间】:2012-10-17 12:17:45
【问题描述】:

列表项

我是 php 新手,我正在尝试执行以下操作:

empid  Salary   Month
1      2342     Jan 
1      3234     Feb
1      3445     Mar
2      3222     Jan
2      3342     Feb
3      3352     Mar

如何显示为:

empid  jan   feb    mar
1      2342  3234  3445
2      3222  3342  3352

【问题讨论】:

  • 你试过了吗?贴一些代码
  • 哪个 SQL? MySQL? SQL Server 等。
  • 如果January 有多个薪水怎么办,例如对于 2011、2012、2013(几个月后)等。我认为您应该使用 year 字段扩展您的表格。我认为您不想显示每个月的总和,是吗?

标签: php sql pivot


【解决方案1】:

您需要像这样行转换为列:

SELECT
  emp_id,
  MAX(CASE WHEN month_end = 'jan' THEN salary END) 'jan',
  MAX(CASE WHEN month_end = 'feb' THEN salary END) 'feb',
  MAX(CASE WHEN month_end = 'mar' THEN salary END) 'mar'
FROM Emps
GROUP BY emp_id

这是执行此操作的标准方法。它应该适用于所有 RDBMS。

【讨论】:

  • @user1753108,随时欢迎您,欢迎来到 Stackoverflow。如果您在此页面中发现它有帮助或任何其他有用的答案,请尝试accept the answer,这就是这里的工作方式。
【解决方案2】:

您没有指定您的 RDBMS,但如果您使用的是 MySQL,并且您返回的值数量未知,那么您使用准备好的语句:

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'sum(case when month_end = ''',
      month_end,
      ''' then salary end) AS ',
      month_end
    )
  ) INTO @sql
FROM yourTable;

SET @sql = CONCAT('SELECT Emp_Id, ', @sql, ' 
                    FROM yourtable 
                    GROUP BY Emp_Id');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

或者您可以通过类似于@Mahmoud 的答案的静态版本对所有月份进行硬编码

如果您在具有类似于 SQL Server 的 PIVOT 函数的 RDBMS 中工作,则可以使用以下内容:

select *
from
(
    select emp_id, salary, month_end
    from yourtable
) x
pivot
(
    max(salary)
    for month_end in ([jan], [feb], [mar])
) p

或者使用动态sql:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(month_end) 
                    from yourtable
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT emp_id, ' + @cols + ' from 
             (
                select emp_id, salary, month_end
                from yourtable
            ) x
            pivot 
            (
                max(salary)
                for month_end in (' + @cols + ')
            ) p '

execute(@query)

【讨论】:

  • 感谢您的回复,现在整理好了。你们都帮了大忙:)
【解决方案3】:
SELECT emp_id AS emp_id , 
[jan], [feb], [mar]
FROM
(SELECT month_end , salary 
    FROM Emps) AS SourceTable
PIVOT
(
AVG(salary )
FOR month_end IN ([jan], [feb], [mar])
) AS PivotTable;

【讨论】:

  • 请尝试使用枢轴功能
猜你喜欢
  • 1970-01-01
  • 2021-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多