繁体   English   中英

计算库存水平-SQL

[英]Calculate Inventory level - SQL

以下是每日的库存水平。 如果一周的某天没有记录,则意味着该天的库存为零。 例如,在这种情况下,第一周的第3、6和7天库存为零

Week |  Day of the Week | Product | Inventory
1   1   A   10
1   2   A   20
1   4   A   5
1   5   A   5
2   2   A   20
2   3   A   15
2   4   A   5
2   7   A   2

我正在寻找的输出如下

Week |  Product |   Inventory on first day of the week  | Inventory on last day of the week |   No of days product was available
1   A   10  0   4
2   A   0   2   4

面试中有人问我这个问题,这就是我的想法。 采访者告诉我,对此有更好的方法。 所以。 任何建议欢迎

WITH CTE_Inventory_Rank
     AS (SELECT Week,
                [Day of the Week],
                Product,
                Inventory,
                RANK() OVER(PARTITION BY WEEK ORDER BY [Day of the Week]) RankAsc,
                RANK() OVER(PARTITION BY WEEK ORDER BY [Day of the Week] DESC) RankDesc
         FROM Inventory),
     CTE_Inventory
     AS (SELECT WEEK,
                Product,
                COUNT(*) [No of days product was available]
         FROM Inventory
         GROUP BY WEEK,
                  PRODUCT)
     SELECT I.Week,
            I.Product,
            CASE
                WHEN first.[Day of the Week] = 1
                THEN first.Inventory
                ELSE 0
            END [Inventory on first day of the week],
            CASE
                WHEN last.[Day of the Week] = 7
                THEN last.Inventory
                ELSE 0
            END [Inventory on first day of the week],
            i.[No of days product was available]
     FROM CTE_INVENTORY I
          JOIN CTE_Inventory_Rank first ON I.week = first.week
                                           AND I.Product = first.Product
                                           AND first.RankAsc = 1
          JOIN CTE_Inventory_Rank last ON I.week = last.week
                                          AND I.Product = last.Product
                                          AND last.RankDesc = 1;

这确实取决于他的意思更好。 性能更好,更短,更漂亮?

Postgres的实时示例: http : //rextester.com/EMKQRJ98261

create table Inventory (week integer, dow integer, product varchar, inventory integer);

insert into Inventory (week, dow, product, inventory) VALUES
(1,1,'A',10),
(1,2,'A',20),
(1,4,'A',5),
(1,5,'A',5),
(2,2,'A',20),
(2,3,'A',15),
(2,4,'A',5),
(2,7,'A',2);


SELECT week,
       product,
       MAX(inv_first_dow) as "Inventory on first day of the week",
       MAX(inv_last_dow) as "Inventory on last day of the week",
       COUNT(*) as "No of days product was available"
FROM (
  SELECT week,
         product,
         CASE WHEN dow.dow = 1 THEN inventory ELSE 0 END AS inv_first_dow,
         CASE WHEN dow.dow = 7 THEN inventory ELSE 0 END AS inv_last_dow
  FROM unnest(array[1,2,3,4,5,6,7]) as dow
  JOIN Inventory ON Inventory.dow = dow.dow
) a
GROUP BY week, product
ORDER BY week

这是MS SQL Server的版本: http : //rextester.com/NQW89990

WITH unnest(dow) AS (SELECT 1 UNION ALL SELECT dow+1 FROM unnest WHERE dow < 7)
SELECT week,
       product, MAX(inv_first_dow) as "Inventory on first day of the week",
       MAX(inv_last_dow) as "Inventory on last day of the week",
       COUNT(*) as "No of days product was available"
FROM (
  SELECT week,
         product,
         CASE WHEN dow.dow = 1 THEN inventory ELSE 0 END AS inv_first_dow,
         CASE WHEN dow.dow = 7 THEN inventory ELSE 0 END AS inv_last_dow
  FROM unnest as dow
  JOIN Inventory ON Inventory.dow = dow.dow
) a
GROUP BY week, product
ORDER BY week

暂无
暂无

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

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