如果日期相同且SQL Server 2008R2和SQL Server中的所有行名称都应不同,则Id为2和Id为1的具体行
我在myRecords表中有以下数据如果日期相同且SQL Server 2008R2和SQL Server中的所有行名称都应不同,则Id为2和Id为1的具体行,sql,sql-server,sql-server-2008-r2,Sql,Sql Server,Sql Server 2008 R2,我在myRecords表中有以下数据 Id Date Name Cash 1 11/25/2016 4:23.123 Ramesh 10000 2 11/25/2016 4:23.173 Suresh 15000 1 11/27/2016 5:23.320 Ramesh 30000 2 11/27/2016 5:23.670 Suresh 40000 我想创建一个视图,这样我就可以得到以下格
Id Date Name Cash
1 11/25/2016 4:23.123 Ramesh 10000
2 11/25/2016 4:23.173 Suresh 15000
1 11/27/2016 5:23.320 Ramesh 30000
2 11/27/2016 5:23.670 Suresh 40000
我想创建一个视图,这样我就可以得到以下格式的数据
Id1 Date1 Name1 Cash1 Id2 Date2 Name2 Cash2
1 11/25/2016 4:23.123 Ramesh 10000 2 11/25/2016 4:23.173 Suresh 15000
1 11/27/2016 5:23.320 Ramesh 30000 2 11/27/2016 5:23.670 Suresh 40000
我该怎么做。只要您的Id加入逻辑不清楚,这在这种情况下会有所帮助,但我想您将来需要添加Id筛选器或额外的标识列和行号
SELECT
T.*, TT.*
FROM
[Table] AS T
INNER JOIN
[Table] AS TT
ON T.Date = TT.Date
只要您的Id加入逻辑不清楚,这将有助于这种情况下,但您将需要添加Id过滤器或额外的标识列和行号,我猜在未来
SELECT
T.*, TT.*
FROM
[Table] AS T
INNER JOIN
[Table] AS TT
ON T.Date = TT.Date
您可以对所需的结果集使用交叉应用
SELECT [ID],
[DATE],
[NAME],
[CASH],
B.*
FROM #TABLE1 A
CROSS APPLY (SELECT ID AS ID2,
[DATE] AS DATE2,
[NAME] AS NAME2,
[CASH] AS CASH2
FROM #TABLE1 B
WHERE A.ID < B.ID
AND CONVERT(DATE, A.DATE) = CONVERT(DATE, B.DATE))B
您可以对所需的结果集使用交叉应用
SELECT [ID],
[DATE],
[NAME],
[CASH],
B.*
FROM #TABLE1 A
CROSS APPLY (SELECT ID AS ID2,
[DATE] AS DATE2,
[NAME] AS NAME2,
[CASH] AS CASH2
FROM #TABLE1 B
WHERE A.ID < B.ID
AND CONVERT(DATE, A.DATE) = CONVERT(DATE, B.DATE))B
如果您正在执行日期操作,并且每天始终只有2条记录,则您可以转换为放弃时间并进行自加入:
DECLARE @myRecords AS TABLE (Id INT, DATE DATETIME, Name VARCHAR(20), CASH INT)
INSERT INTO @myRecords VALUES (1,'11/25/2016 4:23','Ramesh',10000),(2,'11/25/2016 4:23','Suresh',15000)
,(1,'11/27/2016 5:23','Ramesh',30000),(2,'11/27/2016 4:23','Suresh',40000)
SELECT
m1.Id as Id1
,m1.Date as Date1
,m1.Name as Name1
,m1.Cash as Cash1
,m2.Id as Id2
,m2.Date as Date2
,m2.Name as Name2
,m2.Cash as Cash2
FROM
@myRecords m1
LEFT JOIN @myRecords m2
ON CAST(m1.DATE AS DATE) = CAST(m2.DATE AS DATE)
AND m1.Id <> m2.Id
WHERE
m1.Id = 1
如果您正在执行日期操作,并且每天始终只有2条记录,则您可以转换为放弃时间并进行自加入:
DECLARE @myRecords AS TABLE (Id INT, DATE DATETIME, Name VARCHAR(20), CASH INT)
INSERT INTO @myRecords VALUES (1,'11/25/2016 4:23','Ramesh',10000),(2,'11/25/2016 4:23','Suresh',15000)
,(1,'11/27/2016 5:23','Ramesh',30000),(2,'11/27/2016 4:23','Suresh',40000)
SELECT
m1.Id as Id1
,m1.Date as Date1
,m1.Name as Name1
,m1.Cash as Cash1
,m2.Id as Id2
,m2.Date as Date2
,m2.Name as Name2
,m2.Cash as Cash2
FROM
@myRecords m1
LEFT JOIN @myRecords m2
ON CAST(m1.DATE AS DATE) = CAST(m2.DATE AS DATE)
AND m1.Id <> m2.Id
WHERE
m1.Id = 1
这也将返回相同的结果:
select a.id, a.date, a.name, a.cash, b.id as id2, b.date as date2,
b.name as name2, b.cash as cash2
from myTable a
inner join myTable b on a.id+1 = b.id
and cast(a.date as date) <> cast(b.date as date)
这也将返回相同的结果:
select a.id, a.date, a.name, a.cash, b.id as id2, b.date as date2,
b.name as name2, b.cash as cash2
from myTable a
inner join myTable b on a.id+1 = b.id
and cast(a.date as date) <> cast(b.date as date)
这可能有几种方法,但为了正确地实现这一点,我们需要知道您打算如何确定哪一行彼此相关,因为名称和ID不匹配。例如,可以基于日期时间创建一个行号,然后使用自连接将行号连接到行号+1,但这就是记录配对的方式吗?取决于您的数据,ID仅为1和2,或者可能为3、4。。。等等??这可能有几种方法,但为了正确处理,我们需要知道您打算如何确定哪一行彼此相关,因为名称和ID不匹配。例如,可以基于日期时间创建一个行号,然后使用自连接将行号连接到行号+1,但这就是记录配对的方式吗?取决于您的数据,ID仅为1和2,或者可能为3、4。。。等等??非常感谢这对我的帮助。还有一个挑战,这里我想更改RowNum是否为偶数的列名,也就是说,如果RowNum为偶数,您在这里创建了另一列。所以现在我想改变列名,使之不同。i、 RowNum2,Id2,Date2,Name2,Cash2。你所需要做的就是给它们加上别名。我已经更新了我的答案,向您展示了如何做到这一点。非常感谢这对我的帮助。还有一个挑战,这里我想更改RowNum是否为偶数的列名,也就是说,如果RowNum为偶数,您已经在这里创建了另一列。所以现在我想改变列名,使之不同。i、 RowNum2,Id2,Date2,Name2,Cash2。你所需要做的就是给它们加上别名。我已经更新了我的答案,告诉你怎么做。