繁体   English   中英

尝试从表中显示某些列和总和

[英]Trying to Display Certain Columns and Sum from Table

我有我的 SQL 查询,可以显示所有需要的数据,但我需要帮助才能获得特定的输出。 我需要使用下面的查询显示标记为 Loop 的列(不在批量查询中)、LPT 和PLAN_MOVESSUM 我可以对Plan_Moves进行选择总和并将其标记为Target_Daily_Moves但不确定如何显示其他两列。 请帮助我,因为我仍在学习 SQL。

我试图展示这个预期的结果。

在此处输入图像描述

没有“保留循环名称”的新 Mass Query SQL:

    select
da.family,
sysdate update_dttm,
max(dds.sched_update_dttm) max_sched_update_dttm,
dds.lpt,
( case WHEN dds.lpt = '1400' THEN 'MOAT'
WHEN dds.lpt = '3300' THEN 'GATE'
  WHEN dds.lpt = '4800' THEN 'S/D'
    WHEN dds.lpt = '5130' THEN 'PMD'
      WHEN dds.lpt = '5800' THEN 'CONTACT'
        WHEN dds.lpt = '6400' THEN 'VIA 1'
          WHEN dds.lpt = '6900' THEN 'VIA 2'
            WHEN dds.lpt = '7900' THEN 'VIA 3-4'
              WHEN dds.lpt = '9200' THEN 'PO'
                WHEN dds.lpt = '9348' THEN 'PARAMETRICS'
                  WHEN dds.lpt = '9950' THEN 'OUTS'
else 'none'
  end) as LOOPS_INFO,

sum(dds.sched_cur_qty) plan_moves
from device_daily_sched@smsdwde2.itg.ti.com dds, dm_lpt_attributes@Smsdwde2.itg.ti.com la, dm_device_attributes@smsdwde2.itg.ti.com da
where 
dds.facility = 'DP1DM5'
and dds.facility = la.facility
and dds.lpt = la.lpt
and dds.device = da.device
and dds.lpt in('1400','3300','4800','5130','5800','6400','6900','7900','9200','9348','9950')
and (dds.device like 'SN/%'or dds.device like 'SS/%')
and (dds.sched_dttm = trunc(sysdate))
and dds.device not in('SN/BC3ZLTM','SN/DMD8SF','SN/DMD8','SN/DMDASSEM','SN/R035','SN/RFSIGNET','SN/SMIC','SS/BC3ZL','SS/BICOM3ZL','SS/BICOM3','SS/BICOMPBO','SS/R05S','SS/THERM')
group by
da.family,
dds.lpt

原始 Mass Query SQL 没有“保留循环名称”输出:

在此处输入图像描述

更新:最后评论中的 SQL 包含“loops_info”而不是“loop”:

     SELECT a.LOOPS_INFO AS 'LOOPS_INFO', 
          a.lpt AS 'LPT', 
          SUM(a.plan_moves) AS 'Target Daily Moves' 
    FROM (
  select
da.family,
sysdate update_dttm,
max(dds.sched_update_dttm) max_sched_update_dttm,
dds.lpt,
( case WHEN dds.lpt = '1400' THEN 'MOAT'
WHEN dds.lpt = '3300' THEN 'GATE'
  WHEN dds.lpt = '4800' THEN 'S/D'
    WHEN dds.lpt = '5130' THEN 'PMD'
      WHEN dds.lpt = '5800' THEN 'CONTACT'
        WHEN dds.lpt = '6400' THEN 'VIA 1'
          WHEN dds.lpt = '6900' THEN 'VIA 2'
            WHEN dds.lpt = '7900' THEN 'VIA 3-4'
              WHEN dds.lpt = '9200' THEN 'PO'
                WHEN dds.lpt = '9348' THEN 'PARAMETRICS'
                  WHEN dds.lpt = '9950' THEN 'OUTS'
else 'none'
  end) as LOOPS_INFO,

sum(dds.sched_cur_qty) plan_moves
from device_daily_sched@smsdwde2.itg.ti.com dds, dm_lpt_attributes@Smsdwde2.itg.ti.com la, dm_device_attributes@smsdwde2.itg.ti.com da
where 
dds.facility = 'DP1DM5'
and dds.facility = la.facility
and dds.lpt = la.lpt
and dds.device = da.device
and dds.lpt in('1400','3300','4800','5130','5800','6400','6900','7900','9200','9348','9950')
and (dds.device like 'SN/%'or dds.device like 'SS/%')
and (dds.sched_dttm = trunc(sysdate))
and dds.device not in('SN/BC3ZLTM','SN/DMD8SF','SN/DMD8','SN/DMDASSEM','SN/R035','SN/RFSIGNET','SN/SMIC','SS/BC3ZL','SS/BICOM3ZL','SS/BICOM3','SS/BICOMPBO','SS/R05S','SS/THERM')
group by
da.family,
dds.lpt ) AS a 
ORDER BY a.lpt ASC 
GROUP BY a.lpt 
   UNION 
  SELECT 'TOTAL' AS 'LOOPS_INFO', 
         '' AS 'LPT', 
         SUM(b.plan_moves) AS 'Target Daily Moves' 
   FROM (
    select
da.family,
sysdate update_dttm,
max(dds.sched_update_dttm) max_sched_update_dttm,
dds.lpt,
( case WHEN dds.lpt = '1400' THEN 'MOAT'
WHEN dds.lpt = '3300' THEN 'GATE'
  WHEN dds.lpt = '4800' THEN 'S/D'
    WHEN dds.lpt = '5130' THEN 'PMD'
      WHEN dds.lpt = '5800' THEN 'CONTACT'
        WHEN dds.lpt = '6400' THEN 'VIA 1'
          WHEN dds.lpt = '6900' THEN 'VIA 2'
            WHEN dds.lpt = '7900' THEN 'VIA 3-4'
              WHEN dds.lpt = '9200' THEN 'PO'
                WHEN dds.lpt = '9348' THEN 'PARAMETRICS'
                  WHEN dds.lpt = '9950' THEN 'OUTS'
else 'none'
  end) as LOOPS_INFO,

sum(dds.sched_cur_qty) plan_moves
from device_daily_sched@smsdwde2.itg.ti.com dds, dm_lpt_attributes@Smsdwde2.itg.ti.com la, dm_device_attributes@smsdwde2.itg.ti.com da
where 
dds.facility = 'DP1DM5'
and dds.facility = la.facility
and dds.lpt = la.lpt
and dds.device = da.device
and dds.lpt in('1400','3300','4800','5130','5800','6400','6900','7900','9200','9348','9950')
and (dds.device like 'SN/%'or dds.device like 'SS/%')
and (dds.sched_dttm = trunc(sysdate))
and dds.device not in('SN/BC3ZLTM','SN/DMD8SF','SN/DMD8','SN/DMDASSEM','SN/R035','SN/RFSIGNET','SN/SMIC','SS/BC3ZL','SS/BICOM3ZL','SS/BICOM3','SS/BICOMPBO','SS/R05S','SS/THERM')
group by
da.family,
dds.lpt ) AS b 

相同的输出错误:ORA-00923:在预期的地方找不到 FROM 关键字在此处输入图像描述

如果我对“循环”含义的理解是正确的,您可以将多个 if 命令嵌套在一起以测试 lpt 的值,并根据 lpt 的值为每个命令返回一个字符串值作为结果集参数之一。 我假设 lpt 的每个不同值都确定循环的值是什么......所以当 dds.lpt='1400' 时,例如,循环总是值'MOAT',对吗?

或者......使用案例块(看起来更干净)。

有关这两种语法的更多信息,请参阅这篇文章: 如何在 SQL SELECT 中执行 IF...THEN? .

嵌套的 if 或 case 将作为另一个结果列包含在内,然后是“AS loop”,因此结果集包含一个名为 loop 的列和相应的值。

像这样的东西:

select
da.family,
sysdate update_dttm,
max(dds.sched_update_dttm) max_sched_update_dttm,
dds.lpt,
( case-or-if-testing-dds.lpt-values... ) as loop, 
sum(dds.sched_cur_qty) plan_moves
...etc.

将前 5 条评论添加到原始答案后的其他修改答案:

然后尝试将您的整个查询包装在 2 个联合的单独 SELECT 语句周围......不是很漂亮,但如果您不能在其他非 SQL 代码中进行任何后处理,它应该可以为您提供所需的内容:

   SELECT a.loop AS "Loop", 
          a.lpt AS "LPT", 
          SUM(a.plan_moves) "Target Daily Moves" 
    FROM (
  <your entire select SQL in here> 
         ) a 
ORDER BY a.lpt ASC 
GROUP BY a.lpt 
   UNION 
  SELECT "TOTAL" AS "Loop", 
         "" AS "LPT", 
         SUM(b.plan_moves) "Target Daily Moves" 
   FROM (
  <your entire select SQL in here> 
         ) b 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM