如何解决返回给定月份每篇文章的最小和最大库存量的 SQL 语句
示例在表 Bestand
中,是不同物品的多个托盘,每个托盘都有一个预定入库和出库日期;我试图找出每篇文章和每月系统中的最小和最大库存量。
我的想法是,如果我可以返回每天的库存数量,然后读出最小值和最大值。
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 举报,一经查实,本站将立刻删除。