微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

返回给定月份每篇文章的最小和最大库存量的 SQL 语句

如何解决返回给定月份每篇文章的最小和最大库存量的 SQL 语句

我有一个表格,我试图从中返回该商品在系统中的每日数量

示例在表 Bestand 中,是不同物品的多个托盘,每个托盘都有一个预定入库和出库日期;我试图找出每篇文章和每月系统中的最小和最大库存量。

我的想法是,如果我可以返回每天的库存数量,然后读出最小值和最大值。

时间跨度将在运行 sql 时设置,文章将被修复。

为了找出每天的数量,我使用了以下 sql

SELECT disTINCT 
    a.artbez1 AS Artikelbezeichnung,b.artikelnr AS Artikelnummer,SUM(CASE WHEN TO_DATE('2019-11-01 00:00:00','YYYY-MM-DD HH24:MI:SS') BETWEEN b.neu_datum AND b.aender_datum THEN 1 * b.menge_ist ELSE 0 END) AS "01 Nov 2019"
FROM
    artikel a,bestand b
WHERE 
    b.artikelnr IN ('273632002',.... (huge long list of numbers) ....)
    AND b.artikelnr = a.artikelnr
GROUP BY 
    a.artbez1,b.artikelnr;

例如返回:

ARTIKELBEZEICHNUNG ARTIKELNUMMER 2019 年 11 月 1 日
SC-4400.CW 220450002 39
S-320.FK120 220502004 0
H-595.FK120 220800004 35
AC-548.FK209 220948032 0
AS-6800.CW 221355002 20

我想在每月的每一天返回这个,然后从那个返回每篇文章的最小值和最大值

我有以下 sql 来返回给定月份的天数,想知道是否有人对如何组合它们有任何想法(如果可能的话):

SELECT to_date('01.11.2019','dd.mm.yyyy')+LEVEL-1
FROM dual 
CONNECT BY LEVEL <= TO_CHAR(LAST_DAY(to_date('01.11.2019','dd.mm.yyyy')),'DD')
日期
2019-11-01 00:00:00
2019-11-02 00:00:00
2019-11-03 00:00:00
2019-11-04 00:00:00
2019-11-05 00:00:00
2019-11-06 00:00:00
2019-11-07 00:00:00

我试图得到的结果是这样的:

ARTIKELBEZEICHNUNG ARTIKELNUMMER 11 月 19 日 11 月 19 日最大
SC-4400.CW 220450002 5 39
S-320.FK120 220502004 0 15
H-595.FK120 220800004 2 35
AC-548.FK209 220948032 0 0
AS-6800.CW 221355002 10 20

这在 sql 中完全可行吗?

感谢您花时间阅读我的帖子。

杰瑞

解决方法

您可以使用分区外连接:

WITH calendar ( day ) AS (
  SELECT DATE '2019-11-01'
  FROM   DUAL
UNION ALL
  SELECT day + INTERVAL '1' DAY
  FROM   calendar
  WHERE  day < LAST_DAY( DATE '2019-11-01' )
),daily_totals ( artbez1,Artikelnr,Day,total_menge_ist ) AS (
  SELECT MAX( ab.artbez1 ),ab.artikelnr,c.day,COALESCE( SUM( ab.menge_ist ),0 )
  FROM   calendar c
         LEFT OUTER JOIN 
         ( SELECT a.artikelnr,a.artbez1,b.neu_datum,b.aender_datum,b.menge_ist
           FROM   artikel a
                  LEFT JOIN bestand b
                  ON ( a.artikelnr = b.artikelnr )
           -- WHERE  b.artikelnr IN ('273632002',.... (huge long list of numbers) ....)
         ) ab
         PARTITION BY ( ab.artikelnr,ab.artbez1 )
         ON ( c.day BETWEEN ab.neu_datum AND ab.aender_datum )
  GROUP BY ab.artikelnr,c.day
)
SELECT MAX( artbez1 ) AS Artikelbezeichnung,artikelnr AS Artikelnummer,TRUNC( day,'MM' ) AS month,MIN( total_menge_ist ) AS min_total_menge_ist,MAX( total_menge_ist ) AS max_total_menge_ist
FROM   daily_totals
GROUP BY artikelnr,'MM' );

对于样本数据:

CREATE TABLE artikel ( artikelnr,artbez1 ) AS
SELECT 220450002,'SC-4400.CW'   FROM DUAL UNION ALL
SELECT 220502004,'S-320.FK120'  FROM DUAL UNION ALL
SELECT 220800004,'H-595.FK120'  FROM DUAL UNION ALL
SELECT 220948032,'AC-548.FK209' FROM DUAL UNION ALL
SELECT 221355002,'AS-6800.CW'   FROM DUAL;

CREATE TABLE bestand ( artikelnr,neu_datum,aender_datum,menge_ist ) AS
SELECT 220450002,DATE '2019-10-30',DATE '2019-11-01',20 FROM DUAL UNION ALL
SELECT 220450002,DATE '2019-11-05',19 FROM DUAL UNION ALL
SELECT 220502004,DATE '2019-11-03',5 FROM DUAL UNION ALL
SELECT 220800004,DATE '2019-11-15',35 FROM DUAL UNION ALL
SELECT 221355002,DATE '2019-10-20',5 FROM DUAL UNION ALL
SELECT 221355002,DATE '2019-10-25',DATE '2019-11-10',DATE '2019-10-28',DATE '2019-11-13',DATE '2019-11-20',5 FROM DUAL;

输出:

ARTIKELBEZEICHNUNG | ARTIKELNUMMER | MONTH               | MIN_TOTAL_MENGE_IST | MAX_TOTAL_MENGE_IST
:----------------- | ------------: | :------------------ | ------------------: | ------------------:
SC-4400.CW         |     220450002 | 2019-11-01 00:00:00 |                   0 |                  39
S-320.FK120        |     220502004 | 2019-11-01 00:00:00 |                   0 |                   0
AC-548.FK209       |     220948032 | 2019-11-01 00:00:00 |                   0 |                   0
H-595.FK120        |     220800004 | 2019-11-01 00:00:00 |                   0 |                  35
AS-6800.CW         |     221355002 | 2019-11-01 00:00:00 |                   0 |                  25

dbfiddle here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。