2

リストアイテム

私は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
4

3 に答える 3

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で機能するはずです。

于 2012-10-17T12:20:42.367 に答える
0

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と同様の機能を持つRDBMSで作業している場合はPIVOT、次を使用できます。

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)
于 2012-10-17T12:24:34.780 に答える
0
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;
于 2012-10-17T12:42:47.517 に答える