SQL Server连接问题 脚本:
我正在尝试构建一个具有开始日期和结束日期的查询,该查询的结果为我提供了介于日期和日期名称之间的日期。然后,我想加入另一个表,该表包含预期的付款日期和金额。联接表的开始日期和结束日期范围之外的天数可能更多,我想排除这一范围 进展: 我有点像我想要的,但不是在正确的输出中,到目前为止,我已经创建了以下内容:SQL Server连接问题 脚本:,sql,sql-server,join,group-by,Sql,Sql Server,Join,Group By,我正在尝试构建一个具有开始日期和结束日期的查询,该查询的结果为我提供了介于日期和日期名称之间的日期。然后,我想加入另一个表,该表包含预期的付款日期和金额。联接表的开始日期和结束日期范围之外的天数可能更多,我想排除这一范围 进展: 我有点像我想要的,但不是在正确的输出中,到目前为止,我已经创建了以下内容: DECLARE @startDate DATETIME, @endDate DATETIME SET @startDate = CONVERT(VARCHAR(4), DATEPART(YE
DECLARE
@startDate DATETIME,
@endDate DATETIME
SET @startDate = CONVERT(VARCHAR(4), DATEPART(YEAR, DATEADD(MONTH, -1, GETDATE())))+'-'+CONVERT(VARCHAR(2), DATEPART(MONTH, DATEADD(MONTH, -1, GETDATE())))+'-21'
SET @endDate = CONVERT(VARCHAR(4), DATEPART(YEAR, DATEADD(MONTH, -1, GETDATE())))+'-'+CONVERT(VARCHAR(2), DATEPART(MONTH, DATEADD(MONTH, -0, GETDATE())))+'-20'
;WITH dates AS
(
SELECT @startdate as Date,DATENAME(Dw,@startdate) As DayName
UNION ALL
SELECT DATEADD(d,1,[Date]),DATENAME(Dw,DATEADD(d,1,[Date])) as DayName
FROM dates
WHERE DATE < @enddate
)
SELECT LEFT(CONVERT(VARCHAR(30),Date, 106), 2) + '-' + LEFT(CONVERT(VARCHAR(30),Date, 10), 2) Date,DayName, SUM(ExpectedAmount), ExpectedDate FROM dates
FULL JOIN Commissions.dbo.ThreeMonthPayment on CONVERT(VARCHAR(30),Date) = Commissions.dbo.ThreeMonthPayment.ExpectedDate
GROUP BY Date, DayName, ExpectedDate
Order by ExpectedDate
在上面的结果中,我正在尝试将ExpectedDate与date列匹配,因此,我没有看到上面的结果,而是看到这样的结果:简而言之,我没有创建从开始日期和结束日期收到的所有日期
+-------+-----------+------------------+--------------+
| Date | DayName | (No column name) | ExpectedDate |
+-------+-----------+------------------+--------------+
| NULL | NULL | 0 | NULL |
| 21-03 | Friday | 21074 | 21-03 |
| 22-03 | Saturday | 28401 | 22-03 |
| 23-03 | Sunday | 76562 | 23-03 |
| 24-03 | Monday | 47008 | 24-03 |
+-------+-----------+------------------+--------------+
但是您可以在上面看到expectedDate和date列被很好地分组/连接在一起。并且不显示不在日期范围内的预期日期
我整个上午都在努力解决这个问题:这可能吗
任何帮助或链接到线程,我可能已经错过了将是伟大的
我正在使用SQLServer2008
非常感谢。首先,完整连接包括所有内容。两张桌子都有。如果您只需要日期cte中的日期,请使用left join
其次,CONVERTVARCHAR30,Date=Commissions.dbo.ThreeMonthPayment.ExpectedDate似乎不起作用。您确定需要转换吗
我建议你试试这个:
DECLARE
@startDate DATETIME,
@endDate DATETIME
SET @startDate = CONVERT(VARCHAR(4), DATEPART(YEAR, DATEADD(MONTH, -1, GETDATE())))+'-'+CONVERT(VARCHAR(2), DATEPART(MONTH, DATEADD(MONTH, -1, GETDATE())))+'-21'
SET @endDate = CONVERT(VARCHAR(4), DATEPART(YEAR, DATEADD(MONTH, -1, GETDATE())))+'-'+CONVERT(VARCHAR(2), DATEPART(MONTH, DATEADD(MONTH, -0, GETDATE())))+'-20'
;WITH dates AS
(
SELECT @startdate as Date,DATENAME(Dw,@startdate) As DayName
UNION ALL
SELECT DATEADD(d,1,[Date]),DATENAME(Dw,DATEADD(d,1,[Date])) as DayName
FROM dates
WHERE DATE < @enddate
)
SELECT LEFT(CONVERT(VARCHAR(30),Date, 106), 2) + '-' + LEFT(CONVERT(VARCHAR(30),Date, 10), 2) Date
, DayName, SUM(ExpectedAmount), ExpectedDate
FROM dates
LEFT JOIN Commissions.dbo.ThreeMonthPayment
on Date = Commissions.dbo.ThreeMonthPayment.ExpectedDate
GROUP BY
Date
, DayName
, ExpectedDate
Order by
ExpectedDate
您应该创建一个sql小提琴,这样人们就可以玩这个了
DECLARE
@startDate DATETIME,
@endDate DATETIME
SET @startDate = CONVERT(VARCHAR(4), DATEPART(YEAR, DATEADD(MONTH, -1, GETDATE())))+'-'+CONVERT(VARCHAR(2), DATEPART(MONTH, DATEADD(MONTH, -1, GETDATE())))+'-21'
SET @endDate = CONVERT(VARCHAR(4), DATEPART(YEAR, DATEADD(MONTH, -1, GETDATE())))+'-'+CONVERT(VARCHAR(2), DATEPART(MONTH, DATEADD(MONTH, -0, GETDATE())))+'-20'
;WITH dates AS
(
SELECT @startdate as Date,DATENAME(Dw,@startdate) As DayName
UNION ALL
SELECT DATEADD(d,1,[Date]),DATENAME(Dw,DATEADD(d,1,[Date])) as DayName
FROM dates
WHERE DATE < @enddate
)
SELECT LEFT(CONVERT(VARCHAR(30),Date, 106), 2) + '-' + LEFT(CONVERT(VARCHAR(30),Date, 10), 2) Date
, DayName, SUM(ExpectedAmount), ExpectedDate
FROM dates
LEFT JOIN Commissions.dbo.ThreeMonthPayment
on Date = Commissions.dbo.ThreeMonthPayment.ExpectedDate
GROUP BY
Date
, DayName
, ExpectedDate
Order by
ExpectedDate