Oracle SQL将周转换为天

neskvpey  于 2023-10-16  发布在  Oracle
关注(0)|答案(1)|浏览(101)

我需要把周数换算成天数而不重复。
我将使用这个表的例子。
| ID|项目|周末|总数量|
| --|--|--|--|
| 1 |1001REP| 23年9月24日| 0 |
| 1 |1001REP| 23年9月24日| 421 |
| 1 |1001REP| 23年9月24日| 4525 |
| 1 |1001REP| 23年9月24日| 3465 |
| 1 |1001REP| 23年9月24日| 75 |
| 1 |1001REP| 23年9月24日| 943 |
| 1 |1001REP| 23年9月24日| 0 |
| 2 |10AP| 2023年10月1日| 0 |
| 2 |10AP| 2023年10月1日| 543 |
| 2 |10AP| 2023年10月1日| 375 |
| 2 |10AP| 2023年10月1日| 0 |
| 2 |10AP| 2023年10月1日| 0 |
| 2 |10AP| 2023年10月1日| 8945 |
| 2 |10AP| 2023年10月1日| 0 |
我真正想要的是这个例子。
| ID|项目|周末|总数量|天|
| --|--|--|--|--|
| 1 |1001REP| 23年9月24日| 0 |23年9月24日|
| 1 |1001REP| 23年9月24日| 421 |2023年9月25日|
| 1 |1001REP| 23年9月24日| 4525 |2023年9月26日|
| 1 |1001REP| 23年9月24日| 3465 |2023年9月27日|
| 1 |1001REP| 23年9月24日| 75 |2023年9月28日|
| 1 |1001REP| 23年9月24日| 943 |23年9月29日|
| 1 |1001REP| 23年9月24日| 0 |23年9月30日|
| 2 |10AP| 2023年10月1日| 0 |2023年10月1日|
| 2 |10AP| 2023年10月1日| 543 |2023年10月2日|
| 2 |10AP| 2023年10月1日| 375 |2023年10月3日|
| 2 |10AP| 2023年10月1日| 0 |2023年10月4日|
| 2 |10AP| 2023年10月1日| 0 |2023年10月5日|
| 2 |10AP| 2023年10月1日| 8945 |2023年10月6日|
| 2 |10AP| 2023年10月1日| 0 |2023年10月7日|
我试着用这个例子来做,但它为每一列增加了6列。

select a.*, a.weekdate + column_value -1 as Days from table a cross join table (cast(multiset(select level from dual connect by level <= 7 as sys.odcinumberlist)))

我特灵避免在SQL中使用PL SQL代码,但我不得不尝试我所知道的一切。

4xy9mtcn

4xy9mtcn1#

在SQL(不仅仅是Oracle的方言)中,结果集是无序的,除非您指定ORDER BY子句。您的数据似乎没有任何方法来确定数据应该出现的顺序,因为weekdate值都是相同的。
假设数据是由您尚未与我们共享的某种机制预先排序的,则您可以用途:

-- Sample pre-ordered data
WITH pre_ordered_data ( ID, Item, Weekdate, TotalQty ) AS (
SELECT 1, '1001REP', DATE '2023-09-24',    0 FROM DUAL UNION ALL
SELECT 1, '1001REP', DATE '2023-09-24',  421 FROM DUAL UNION ALL
SELECT 1, '1001REP', DATE '2023-09-24', 4525 FROM DUAL UNION ALL
SELECT 1, '1001REP', DATE '2023-09-24', 3465 FROM DUAL UNION ALL
SELECT 1, '1001REP', DATE '2023-09-24',   75 FROM DUAL UNION ALL
SELECT 1, '1001REP', DATE '2023-09-24',  943 FROM DUAL UNION ALL
SELECT 1, '1001REP', DATE '2023-09-24',    0 FROM DUAL UNION ALL
SELECT 2, '10AP',    DATE '2023-10-01',    0 FROM DUAL UNION ALL
SELECT 2, '10AP',    DATE '2023-10-01',  543 FROM DUAL UNION ALL
SELECT 2, '10AP',    DATE '2023-10-01',  375 FROM DUAL UNION ALL
SELECT 2, '10AP',    DATE '2023-10-01',    0 FROM DUAL UNION ALL
SELECT 2, '10AP',    DATE '2023-10-01',    0 FROM DUAL UNION ALL
SELECT 2, '10AP',    DATE '2023-10-01', 8945 FROM DUAL UNION ALL
SELECT 2, '10AP',    DATE '2023-10-01',    0 FROM DUAL
)

-- Actual query on the pre-ordered data
SELECT p.*,
       weekdate
       + ROW_NUMBER() OVER (
           PARTITION BY id, weekdate
           ORDER BY ROWNUM
         )
       - 1 AS days
FROM   pre_ordered_data p

其输出:
| ID|项目|工作日|总数|天|
| --|--|--|--|--|
| 1 |1001REP| 2023-09-24 00:00:00| 0 |2023-09-24 00:00:00|
| 1 |1001REP| 2023-09-24 00:00:00| 421 |2023-09-25 00:00:00|
| 1 |1001REP| 2023-09-24 00:00:00| 4525 |2023-09-26 00:00:00|
| 1 |1001REP| 2023-09-24 00:00:00| 3465 |2023-09-27 00:00:00|
| 1 |1001REP| 2023-09-24 00:00:00| 75 |2023-09-28 00:00:00|
| 1 |1001REP| 2023-09-24 00:00:00| 943 |2023-09-29 00:00:00|
| 1 |1001REP| 2023-09-24 00:00:00| 0 |2019 -09- 23 00:00:00|
| 2 |10AP| 2023-10-01 00:00:00| 0 |2023-10-01 00:00:00|
| 2 |10AP| 2023-10-01 00:00:00| 543 |2019 - 02 - 22 00:00:00|
| 2 |10AP| 2023-10-01 00:00:00| 375 |2019 -03 - 12 00:00:00|
| 2 |10AP| 2023-10-01 00:00:00| 0 |2019 -04 - 22 00:00:00|
| 2 |10AP| 2023-10-01 00:00:00| 0 |2023-10-05 00:00:00|
| 2 |10AP| 2023-10-01 00:00:00| 8945 |2023-10-06 00:00:00|
| 2 |10AP| 2023-10-01 00:00:00| 0 |2019 -07 - 22 00:00:00|
如果你有一个按天排序行的机制(通常是另一列),那么就使用它:

SELECT u.*,
       weekdate
       + ROW_NUMBER() OVER (
           PARTITION BY id, weekdate
           ORDER BY your_extra_column_that_orders_the_days
         )
       - 1 AS days
FROM   unordered_data u

fiddle

相关问题