You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于STNO列值创建新列并填充QYHND对应值(SQL)

需求与解决方案:将STNO值转为列名并填充对应QYHND值

需求说明

需要以STNO列的取值作为新列名称,将对应行的QYHND值填入相应新列,同时保持按PANO20列的排序顺序。例如当PANO20为6Y9807、STNO为02、QYHND为6时,新列02中该行的值应为6。

当前数据表

PANO20QYHNDSTNO
6Y9807602
6N3191801
14766051502
1672190601
2641440200

期望得到的数据表

PANO20QYHNDSTNO000102
6Y98076026
6N31918018
1476605150215
16721906016
26414402002

尝试的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;

关键说明

  1. 不需要使用SUM和GROUP BY:你的原始数据中每个PANO20对应唯一的STNO,聚合会合并行,不符合保留原始行的需求。
  2. 数字开头的列名需要用方括号[]包裹:SQL中对非标准列名(如数字开头)需要用方括号标识,避免语法错误。
  3. 未匹配的STNO会自动返回NULL,对应示例中的空值效果。

内容的提问来源于stack exchange,提问作者lberecek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 05:07:54