如何将行数据透视为列并在 SQL 中动态填充数据

How pivot row data as columns and fill data dynamically in SQL

我有一个 table 列名称 ExDescription,Code,Week00,QtySoldWeek00 列包含诸如 Week1、week2、week3、week4 等...Week53 等值。

现在,我需要编写一个查询来打印 Week00 值作为列名及其来自 SUM(QtySold) 的值。我尝试了类似下面的内容,但没有得到结果。

                select * from week_report1            
            pivot (SUM (QtySold) for week_00 in ([Week1],
            [Week2],
            [Week3],
            [Week4],
            [Week5],
            [Week6],
            [Week7],
            [Week8],
            [Week9],
            .........
            [Week52],
            [Week53])) as MaxIn
            where Code in ('99');

我正在附加 excel 所需输出的枢轴显示,以便更好地了解我想要做什么。

不确定这是否适合您,但请尝试一下。(适用于 MySQL

SET @sql = NULL;
SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'SUM(IF(week_00 = ''',
      week_00,
      ''', QtySold, 0)) AS `',
      week_00, '`'
    )
  ) INTO @sql
FROM week_report1;
SET @sql = CONCAT('SELECT Code, ', @sql, ' FROM week_report1 GROUP BY Code');

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

Oracle 设置:

CREATE TABLE table_name (
  ExDescription VARCHAR2(20),
  Code          INT,
  Week00        VARCHAR2(6),
  QtySold       INT
);

-- Some random data:
INSERT INTO table_name ( ExDescription, Code, Week00, QtySold )
  SELECT DBMS_RANDOM.STRING('X',10),
         99,
         'Week' || LEVEL,
         ROUND( DBMS_RANDOM.VALUE(0,101)-0.5)
  FROM   DUAL
  CONNECT BY LEVEL <= 53;

SELECT * FROM table_name;

EXDESCRIPTION              CODE WEEK00    QTYSOLD
-------------------- ---------- ------ ----------
V01WLMUC50                   99 Week1          74 
MT0HLG35FH                   99 Week2          53 
QSXPKDNDPO                   99 Week3           0 
...

查询:

SELECT *
FROM   ( SELECT Code, Week00, QtySold FROM table_name WHERE code = 99 )
PIVOT ( SUM( QtySold ) FOR Week00 IN (
  'Week1' AS Week1,
  'Week2' AS Week2,
  'Week3' AS Week3
  -- ...
) );

输出

      CODE      WEEK1      WEEK2      WEEK3
---------- ---------- ---------- ----------
        99         74         53          0