Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.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 server 使用sql将一个表转换为另一个表_Sql Server_Sql Server 2008_Tsql - Fatal编程技术网

Sql server 使用sql将一个表转换为另一个表

Sql server 使用sql将一个表转换为另一个表,sql-server,sql-server-2008,tsql,Sql Server,Sql Server 2008,Tsql,我有下面的表1,我想把它转换成表2。该表由一系列属性和日期组成。有些记录有审核日期,有些记录可能没有。我想返回一个属性列表和所有相应的审核日期,审核日期中应该始终有一个显示为空的记录。最后,我想在最后一列中返回上一个审阅日期,这是该属性的其他记录上最近的审阅日期。请告知如何以有效的方式进行转换。多谢各位 CREATE TABLE Table1 (`Property` varchar(1), `ReviewDate` varchar(9), `Due` datetime) ; INSERT I

我有下面的表1,我想把它转换成表2。该表由一系列属性和日期组成。有些记录有审核日期,有些记录可能没有。我想返回一个属性列表和所有相应的审核日期,审核日期中应该始终有一个显示为空的记录。最后,我想在最后一列中返回上一个审阅日期,这是该属性的其他记录上最近的审阅日期。请告知如何以有效的方式进行转换。多谢各位

CREATE TABLE Table1
(`Property` varchar(1), `ReviewDate` varchar(9), `Due` datetime)
 ;

INSERT INTO Table1
(`Property`, `ReviewDate`, `Due`)
 VALUES
('A', '1/31/2017', '2017-03-30 19:00:00'),
('A', '1/15/2016', '2016-03-30 19:00:00'),
('A', '1/10/2015', '2015-03-30 19:00:00'),
('B', NULL, '2017-03-30 19:00:00'),
('B', '1/15/2016', '2016-03-30 19:00:00'),
('B', '1/10/2015', '2015-03-30 19:00:00')
;




CREATE TABLE Table2
(`Property` varchar(1), `ReviewDate` varchar(9), `Due` datetime, `PreviousReviewDate` varchar(9))
;

INSERT INTO Table2
(`Property`, `ReviewDate`, `Due`, `PreviousReviewDate`)
VALUES
('A', NULL, NULL, '1/31/2017'),
('A', '1/31/2017', '2017-03-30 19:00:00', '1/15/2016'),
('A', '1/15/2016', '2016-03-30 19:00:00', '1/10/2015'),
('A', '1/10/2015', '2015-03-30 19:00:00', NULL),
('B', NULL, '2017-03-30 19:00:00', '1/15/2016'),
('B', '1/15/2016', '2016-03-30 19:00:00', '1/10/2015'),
('B', '1/10/2015', '2015-03-30 19:00:00', NULL)
;

自动联接+不等联接+分组方式

使用相同的
属性连接每一行
,并选择
Max(ReviewDate)
(当前之前)以确定前一行

此解决方案符合标准SQL(Postgres、SqlServer等)

检查这个():

创建表表1
(属性varchar(1),审核日期,到期日期时间);
插入表1
(属性、审核日期、到期日)
价值观
(‘A’、‘2017年1月31日’、‘2017-03-30 19:00:00’),
(‘A’、‘2016年1月15日’、‘2016-03-30 19:00:00’),
(‘A’、‘2015年10月1日’、‘2015-03-30 19:00:00’),
('B',空,'2017-03-30 19:00:00'),
(‘B’、‘2016年1月15日’、‘2016-03-30 19:00:00’),
(‘B’、‘2015年10月1日’、‘2015-03-30 19:00:00’);
创建表2
(属性varchar(1),审核日期,到期日期时间,上一次审核日期);
插入表2(属性、审核日期、到期日、上一次审核日期)
选择具有合并关系的前1名(当前属性、上一属性)、当前审阅日期、当前到期日期、上一审阅日期作为上一审阅日期
从表1中取当前值
完全联接表1如前所示
ON Curr.Property=Prev.Property
和Prev.ReviewDate<合并(Curr.ReviewDate,GETDATE())
按行编号()排序(按当前属性划分,按当前审阅日期划分,按当前到期顺序按当前审阅日期描述划分)
在Property=Property和Date
此外,我建议对这些日期字段使用
date
类型,而不是
varchar

始终提及您使用的数据库或软件的版本。这将帮助你得到更好的答案。您正在使用哪个版本的SQL Server。还可以用sql Server标记您的问题表2中的第一行是什么?('A',NULL,NULL,'1/31/2017'),为什么有这一行?我希望总是有一个没有审核日期的记录。把它想象成一个可接受的答案。嗨,如果答案是确定的,你能投票(一个或多个答案)并标记为解决你的首选答案吗。谢谢你和我。请考虑一下;-)从我的移动设备。。。但想法就在这里。我尝试格式化代码并对其进行更新,我重新格式化并重写了代码,我们对@zambonee的想法大致相同
CREATE TABLE Table1
(Property varchar(1), ReviewDate date, Due datetime)
 ;

INSERT INTO Table1
(Property, ReviewDate, Due)
 VALUES
('A', '1/31/2017', '2017-03-30 19:00:00'),
('A', '1/15/2016', '2016-03-30 19:00:00'),
('A', '1/10/2015', '2015-03-30 19:00:00'),
('B', NULL, '2017-03-30 19:00:00'),
('B', '1/15/2016', '2016-03-30 19:00:00'),
('B', '1/10/2015', '2015-03-30 19:00:00')
;


Create Table2 as
Select
    coalesce(A.Property,B.Property) as Property,        
    A.ReviewDate,
    A.Due, 
    Max(B.ReviewDate) as PreviousReviewDate
From
   Table1 A
   full join Table1 B On
        A.Property   = B.Property and
        A.ReviewDate > B.ReviewDate 
group by
   A.Property,A.ReviewDate,A.Due,B.Property
having
   not(A.ReviewDate is null and  Max(B.ReviewDate) is null)
CREATE TABLE Table1
(Property varchar(1), ReviewDate date, Due datetime);

INSERT INTO Table1
(Property, ReviewDate, Due)
VALUES
('A', '1/31/2017', '2017-03-30 19:00:00'),
('A', '1/15/2016', '2016-03-30 19:00:00'),
('A', '1/10/2015', '2015-03-30 19:00:00'),
('B', NULL, '2017-03-30 19:00:00'),
('B', '1/15/2016', '2016-03-30 19:00:00'),
('B', '1/10/2015', '2015-03-30 19:00:00');

CREATE TABLE Table2
(Property varchar(1), ReviewDate date, Due datetime, PreviousReviewDate date);

INSERT INTO Table2 (Property, ReviewDate, Due, PreviousReviewDate)
SELECT TOP 1 WITH TIES COALESCE(Curr.Property, Prev.Property), Curr.ReviewDate, Curr.Due, Prev.ReviewDate AS PreviousReviewDate 
FROM Table1 AS Curr
FULL JOIN Table1 AS Prev
ON Curr.Property = Prev.Property
AND Prev.ReviewDate < COALESCE(Curr.ReviewDate, GETDATE())
ORDER BY ROW_NUMBER() OVER (PARTITION BY Curr.Property, Curr.ReviewDate, Curr.Due ORDER BY Prev.ReviewDate DESC)