【发布时间】:2022-01-27 09:47:42
【问题描述】:
你好我有这样的情况我基本上需要为这样的语句写一个SQL代码
select *,
case when 'Issue' IN ('Overforecasted', 'Underforecasted') AND 'Start Date' DISTINCT 3 dates THEN 'Issue exists for 3 weeks in a row'
FROM Merged;
我知道这不是正确的 SQL 格式,但有人知道如何编辑它吗?
每一个 DMDUNIT 检查它是否在“问题”列中有 3 个问题,然后检查它是否有 3 个不同的开始日期。如果它有 3 个问题(“预测过度”、“预测不足”)和同一 DMDUNIT 的 3 个不同日期,我需要在新列中返回它(以“3InARow”结尾)
当前编辑的草稿
SET ARITHABORT OFF
SET ANSI_WARNINGS OFF;
;WITH Forecast AS (
SELECT LOC, DMDUNIT, STARTDATE, TOTFCST
FROM SCPOMGR.FCSTPERFSTATIC
WHERE STARTDATE >= '2021-11-24'
), Actuals AS (
SELECT LOC, DMDUNIT, DMDPostDate, HistoryQuantity
FROM SCPOMGR.HISTWIDE_CHAIN
WHERE DMDPostDate >= '2021-11-24'
), Merged as (
select
COALESCE(f.LOC, a.LOC) AS LOC,
COALESCE(f.DMDUNIT, a.DMDUNIT) AS DMDUNIT,
COALESCE(f.STARTDATE, a.DMDPostDate) AS "Start Date",
SUM(F.TOTFCST) AS "Forecast",
SUM(a.HistoryQuantity) AS "Actuals",
SUM(ABS(a.HistoryQuantity) - f.TOTFCST) AS "Abs Error",
(1 - HistoryQuantity - TOTFCST) / HistoryQuantity as "FA%",
SUM(a.HistoryQuantity) / SUM(f.TOTFCST) AS "Bias",
CASE
WHEN TOTFCST > HistoryQuantity THEN 'Overforecasted'
WHEN TOTFCST < HistoryQuantity THEN 'Underforecasted'
WHEN HistoryQuantity IS NULL AND TOTFCST > 0 THEN 'Overforecasted'
WHEN TOTFCST IS NULL AND HistoryQuantity > 0 THEN 'Underforecasted'
WHEN TOTFCST = 0.000 AND HistoryQuantity IS NULL THEN 'No issue'
END AS Issue
FROM Forecast f FULL OUTER JOIN Actuals a
ON f.LOC = a.LOC AND f.DMDUNIT = a.DMDUNIT AND f.STARTDATE = a.DMDPostDate
GROUP BY
COALESCE(f.LOC, a.LOC),
COALESCE(f.DMDUNIT, a.DMDUNIT),
COALESCE(f.STARTDATE, a.DMDPostDate),
a.HistoryQuantity, F.TOTFCST),
Transitions as (
select *,
case when indicator <> lag(indicator)
over (partition by DMDUNIT order by "Start Date")
then 1 end as tripped
from Merged cross apply (
select case when Issue in ('Overforecasted', 'Underforecasted')
then 1 else 0 end as indicator) v
), Bundles as (
select *, count(tripped) over (partition by DMDUNIT order by "Start Date") as grp
from Transitions
), Streaks as (
select *, count(*) over (partition by DMDUNIT, grp) as cnt
from Bundles
)
select *, case when indicator = 1 and cnt >= 3 then 'Yes' else 'No' end as InIssueStreak, cnt as StreakLength
from Streaks;
【问题讨论】:
-
-
@JonArmstrong 对不起,我不明白。添加架构将如何帮助我解决我的问题?你能不能调整一下代码,否则我不明白你想让我做什么......
-
通过正式定义问题并提供您希望看到的确切行为示例来帮助他人帮助您。请参阅以下建议:meta.stackoverflow.com/questions/271055/… 和 stackoverflow.com/help/minimal-reproducible-example
-
首先纠正您的 SQL 引用的错误或未定义的对象。 dbfiddle.uk/…
-
@JonArmstrong 我使用 SSMS。我真的没有任何问题,例如“无效的对象名称 'SCPOMGR.FCSTPERFSTATIC'”。运行时。不确定该站点 dbfiddle 应该显示什么...