Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL基于日期合并值并添加结果列_Sql_Sql Server_Tsql - Fatal编程技术网

SQL基于日期合并值并添加结果列

SQL基于日期合并值并添加结果列,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个包含以下数据的表date是一种INT数据类型,它由对象组成,每个对象有两种类型,可以设置为不可修改或在特定时间范围内可修改: Object Type StatusOld StatusNew Date /1BCDWB/ 2 Not modifiable Modifiable 20011003 HOME 1 Not modifiable Modifiable 20011003 /1BCDWB/ 2 Modifiable Not modifiab

我有一个包含以下数据的表date是一种INT数据类型,它由对象组成,每个对象有两种类型,可以设置为不可修改或在特定时间范围内可修改:

Object Type StatusOld   StatusNew   Date
/1BCDWB/    2    Not modifiable Modifiable  20011003
HOME    1    Not modifiable Modifiable  20011003
/1BCDWB/    2    Modifiable Not modifiable  20011003
HOME    1    Modifiable Not modifiable  20011003
/0CUST/ 2    Not modifiable Modifiable  20011003
/0SAP/  2    Not modifiable Modifiable  20011003
/0SAP/  2    Modifiable Not modifiable  20011003
/1BCABA/    2    Not modifiable Modifiable  20011003
/1BCABA/    2    Modifiable Not modifiable  20011003
/0CUST/ 2    Not modifiable Modifiable  20011003
/0SAP/  2    Not modifiable Modifiable  20011003
/1BCABA/    2    Not modifiable Modifiable  20011003
/1BCDWB/    2    Not modifiable Modifiable  20011003
/0CUST/ 2    Modifiable Not modifiable  20011003
/0SAP/  2    Modifiable Not modifiable  20011003
/1BCABA/    2    Modifiable Not modifiable  20011003
/1BCDWB/    2    Modifiable Not modifiable  20011003
/0CUST/ 2    Modifiable Not modifiable  20011210
/1BCDWB/    2    Modifiable Not modifiable  20011210
HOME    1    Modifiable Not modifiable  20011210
/0CUST/ 2    Not modifiable Modifiable  20011210
/1BCDWB/    2    Not modifiable Modifiable  20011210
HOME    1    Not modifiable Modifiable  20011210
HOME    1    Not modifiable Modifiable  20020211

然后,我有一个表,其中包含我需要检查的相关时间范围值:

start_date end_date
20000610 20000610
20000611 20011002 
在最终结果中,如果一个对象的类型1和类型2在上述时间范围内都被设置为可修改,我需要一个简单的是或否:

SystemModifiable start_date end_date
No 20000610 20000610
No 20000611 20011002 
所以我想到了一个CTE案例陈述如下:

Case
    When ((Type=1 And StatusNew=Modifiable) And (Type=2 And StatusNew=Modifiable)) And -- For each date range-- Then 'Yes'
    Else 'No'
End As SystemModifiable
也许这个伪代码将有助于更好地理解它。对于是,因此需要满足以下条件:

IF (Type=1 AND StatusNew=modifiable AND
Type=2 AND StatusNew=modifiable) SET SystemModifiable to 'Yes'
ELSE SET SystemModifiable to 'No'

非常感谢您的帮助,如果您有问题,请告诉我。

在您最近的更改之前,我准备了一个查询-但是,应该可以很容易地修改,我想:

首先,我构建了一个带有时间跨度和所有使用ID的cte,在您的例子中,只有1和2。在此基础上,我评估当前时间跨度内所选ID的最新状态更改。基于此,我执行一个pivot操作,以便在每个时间跨度的一行中获得ids1和ids2的状态。然后,可以用case语句查询(如您所述)。下面是示例代码:

WITH cteTimeSpan AS (
  SELECT T3.ID, T2.*, ROW_NUMBER() OVER (ORDER BY start_date) rn
    FROM T2
    CROSS JOIN (SELECT DISTINCT ID FROM T1) AS T3
),
cteStatChanges AS(
  SELECT ts.ID, ts.rn, ts.start_date, ts.end_date, t1.StatusNew, T1.[Date], ROW_NUMBER() OVER (PARTITION BY ts.rn, ts.ID ORDER BY start_date DESC) rn2
    FROM cteTimeSpan AS ts
    LEFT JOIN T1 ON T1.[Date] >= ts.start_date AND T1.[Date] <= ts.end_date
),
cteFilter AS(
  SELECT csc.ID, csc.start_date, csc.end_date, csc.StatusNew
    FROM cteStatChanges csc
    WHERE rn2 = 1
),
ctePiv AS(
  SELECT start_date, end_date, [1], [2]
    FROM cteFilter
  PIVOT (
    MAX(StatusNew)
    FOR ID IN ([1], [2])
  ) piv
)
SELECT p.start_date, p.end_date, CASE WHEN ISNULL([1], N'Not Modifiable') = N'Modifiable' AND ISNULL([2], N'Not Modifiable') = N'Modifiable' THEN N'yes' ELSE N'no' END AS SystemModifiable
  FROM ctePiv p
有关详细信息,请参见小提琴:

这是您想要的吗

select r.start_date, r.end_date, t.object,
       (case when count(distinct type) = 2 then 'Yes' else 'No' end)
from ranges r join
     t
     on t.date between r.start_date and r.end_date
where StatusNew = 'Modifiable' and
      type in (1, 2)
group by t.object;

请尝试将以下查询注释内联:

select mt.Object, ts.start_date, ts.end_date,
       -- since we have only type 1 or 2, this check will suffice to determine whether 1 and 2 type were included
       case when count(distinct Type) = 2 then 'Yes' else 'No' end
from MyTable mt
right join Timespans ts on mt.Date between ts.start_date and ts.end_date
-- here we want only those records, that were changed to modifiable and only with Type 1 or 2
where mt.Type in (1, 2) and
      mt.StatusNew = 'Modifiable'
      -- to include timespans, which don't have any matching entry
      or (mt.type is null and mt.Object is null)
-- Group by timespan and by object
group by mt.Object, ts.start_date, ts.end_date

进一步注意:如您在演示中所见,上面的查询将为您提供每个时间跨度和每个对象的结果,要获得每个时段的简单答案,只需按时间跨度再次分组,检查组中是否有任何是:

预期的结果是什么,如果-在分析的时间跨度内-ID首先设置为可修改,然后再设置为不可修改?你想考虑时间内每个ID的最后更改吗?@ TyRoN78我在我的问题中加了一个栏,并加了一些解释,我认为应该更好地解释它?我不明白你的结果。对象在哪里表示?@GordonLinoff对不起,让我试着解释一下:每个对象存在两次,一次是类型1,一次是类型2。现在,为了使我的结果为“是”,需要将该时间范围内任何对象的类型1和类型2设置为“可修改”。所以这个对象实际上并不重要,因为我只需要寻找两个可修改的入口,其中一个是type 1,另一个是type to。我将在我的帖子中添加一个解释。这将独立于时间跨度进行分组。因此,这个查询给出了时间跨度,系统在哪里可以修改-据我所知,OP的结果应该显示每个时间跨度的信息,如果可以修改或不可以修改。。。否?@Tyron78这将给出包含每个时间跨度的结果,并将指示它是否可修改。我刚刚用两个时间跨度对其进行了测试,其中一个可修改,但结果仅显示一行-请检查?这是小提琴:@Tyron78您的桌子没有类型或对象column@Tyron78答案里有