如何基于STNO列值创建新列并填充QYHND对应值(SQL)
需求与解决方案:将STNO值转为列名并填充对应QYHND值
需求说明
需要以STNO列的取值作为新列名称,将对应行的QYHND值填入相应新列,同时保持按PANO20列的排序顺序。例如当PANO20为6Y9807、STNO为02、QYHND为6时,新列02中该行的值应为6。
当前数据表
| PANO20 | QYHND | STNO |
|---|---|---|
| 6Y9807 | 6 | 02 |
| 6N3191 | 8 | 01 |
| 1476605 | 15 | 02 |
| 1672190 | 6 | 01 |
| 2641440 | 2 | 00 |
期望得到的数据表
| PANO20 | QYHND | STNO | 00 | 01 | 02 |
|---|---|---|---|---|---|
| 6Y9807 | 6 | 02 | 6 | ||
| 6N3191 | 8 | 01 | 8 | ||
| 1476605 | 15 | 02 | 15 | ||
| 1672190 | 6 | 01 | 6 | ||
| 2641440 | 2 | 00 | 2 |
尝试的SQL代码
代码1:关联查询并计算需求总和
select ps.PANO20, ps.SOS1, ps.QYHND, ps.QYOR, ps.MIN, ps.MAX, ps.STNO, ps.SKNSKI, ms.SOS1, ms.UNCS, SUM (DMMO01+ DMMO02+ DMMO03+ DMMO04+ DMMO05+ DMMO06+ DMMO07+ DMMO08+ DMMO09+ DMMO10+ DMMO11+ DMMO12) as [Demand12] from LIBH07.dbo.PCPPIST0 ps inner join LIBCOM500.dbo.PCPPRMS0 ms on ps.PANO20 = ms.PANO20 where ps.STNO IN ('00','01','02','03') and ps.SOS1 = '000' and ms.SOS1 = '000' group by ps.SOS1, ps.PANO20, qyhnd, qyor, MIN, MAX, stno, sknski, ms.sos1, ms.UNCS order by PANO20 desc
代码2:尝试创建转置表
create table OnHandStore as select PANO20, SUM(case when stno = '00' then qyhnd end) as Henderson, SUM(case when stno = '01' then qyhnd end) as Reno, SUM(case when stno = '02' then qyhnd end) as Elko, SUM(case when stno = '03' then qyhnd end) as Winnemucca, from pcppist0 as t1 group by PANO20;
正确实现方法
你的需求是保留每一行的原始数据,同时新增对应STNO的列,不需要聚合合并行,因此直接使用CASE WHEN条件判断生成新列即可。
基础版(仅处理核心需求)
SELECT PANO20, QYHND, STNO, CASE WHEN STNO = '00' THEN QYHND END AS [00], CASE WHEN STNO = '01' THEN QYHND END AS [01], CASE WHEN STNO = '02' THEN QYHND END AS [02], CASE WHEN STNO = '03' THEN QYHND END AS [03] FROM pcppist0 ORDER BY PANO20;
关联查询版(结合你第一个查询的业务逻辑)
如果需要保留关联查询和需求总和的计算,将CASE WHEN逻辑加入原查询即可:
SELECT ps.PANO20, ps.SOS1, ps.QYHND, ps.QYOR, ps.MIN, ps.MAX, ps.STNO, ps.SKNSKI, ms.SOS1 AS ms_SOS1, -- 重命名避免列名重复 ms.UNCS, SUM(ps.DMMO01 + ps.DMMO02 + ps.DMMO03 + ps.DMMO04 + ps.DMMO05 + ps.DMMO06 + ps.DMMO07 + ps.DMMO08 + ps.DMMO09 + ps.DMMO10 + ps.DMMO11 + ps.DMMO12) AS [Demand12], CASE WHEN ps.STNO = '00' THEN ps.QYHND END AS [00], CASE WHEN ps.STNO = '01' THEN ps.QYHND END AS [01], CASE WHEN ps.STNO = '02' THEN ps.QYHND END AS [02], CASE WHEN ps.STNO = '03' THEN ps.QYHND END AS [03] FROM LIBH07.dbo.PCPPIST0 ps INNER JOIN LIBCOM500.dbo.PCPPRMS0 ms ON ps.PANO20 = ms.PANO20 WHERE ps.STNO IN ('00','01','02','03') AND ps.SOS1 = '000' AND ms.SOS1 = '000' GROUP BY ps.SOS1, ps.PANO20, ps.QYHND, ps.QYOR, ps.MIN, ps.MAX, ps.STNO, ps.SKNSKI, ms.SOS1, ms.UNCS ORDER BY ps.PANO20 DESC;
关键说明
- 不需要使用
SUM和GROUP BY:你的原始数据中每个PANO20对应唯一的STNO,聚合会合并行,不符合保留原始行的需求。 - 数字开头的列名需要用方括号
[]包裹:SQL中对非标准列名(如数字开头)需要用方括号标识,避免语法错误。 - 未匹配的
STNO会自动返回NULL,对应示例中的空值效果。
内容的提问来源于stack exchange,提问作者lberecek
相关产品推荐
相关产品推荐

