如何将行数据透视为列并在 SQL 中动态填充数据
How pivot row data as columns and fill data dynamically in SQL
我有一个 table 列名称 ExDescription,Code,Week00,QtySold。 Week00 列包含诸如 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
我有一个 table 列名称 ExDescription,Code,Week00,QtySold。 Week00 列包含诸如 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