我在SQL Server 2012中创建了以下存储过程...
ALTER PROCEDURE [dbo].[GET_DASHBOARD_LINECHART_DATA]
AS
BEGIN
SET NOCOUNT ON;
-- PULL THE DATA
SELECT COUNT(*) AS TICKET_COUNT,
CAST(DATE_ENTERED AS DATE) AS DATE_ENTERED,
DATENAME(weekday,DATE_ENTERED) AS DAY_ENTERED
FROM TICKETS
WHERE DATE_ENTERED >= DATEADD(day,-7,GETDATE())
GROUP BY DATENAME(weekday,DATE_ENTERED), CAST(DATE_ENTERED AS DATE)
ORDER BY DATE_ENTERED ASC
SET NOCOUNT OFF;
END
它将显示类似于以下的输出...
我希望它能够显示前几周的票数(今天和之前的6天),即使有些日期没有输入票证。它只会显示0。所以我的输出看起来包含周四,周五,周六,周日,周一,周二,周三。
如何实现这一目标?
答案 0 :(得分:4)
您需要为前几天构建一个日期表,并为其执行RIGHT JOIN
:
Alter Procedure [dbo].[GET_DASHBOARD_LINECHART_DATA]
As Begin
Set NoCount On
Declare @FromDate Date = DateAdd(Day, -7, GetDate()),
@ToDate Date = GetDate()
;With Date (Date) As
(
Select @FromDate Union All
Select DateAdd(Day, 1, Date)
From Date
Where Date < @ToDate
)
Select Count(T.Date_Entered) As TICKET_COUNT,
D.Date As DATE_ENTERED,
DateName(WeekDay, D.Date) As DAY_ENTERED
From Tickets T
Right Join Date D On D.Date = Convert(Date, T.DATE_ENTERED)
Group By DateName(WeekDay, D.Date), D.Date
Order By D.Date Asc
End
答案 1 :(得分:1)
这应该这样做:
ALTER PROCEDURE [dbo].[GET_DASHBOARD_LINECHART_DATA]
AS
BEGIN
SET NOCOUNT ON;
-- PULL THE DATA
WITH A
AS (SELECT COUNT(*) AS TICKET_COUNT
, CAST(DATE_ENTERED AS DATE) AS DATE_ENTERED
, DATENAME(weekday, DATE_ENTERED) AS DAY_ENTERED
FROM TICKETS
WHERE DATE_ENTERED >= DATEADD(day, -7, GETDATE())
GROUP BY DATENAME(weekday, DATE_ENTERED)
, CAST(DATE_ENTERED AS DATE)),
B
AS (
SELECT 'Monday' AS DAY_ENTERED
UNION
SELECT 'Tuesday' AS DAY_ENTERED
UNION
SELECT 'Wednesday' AS DAY_ENTERED
UNION
SELECT 'Thursday' AS DAY_ENTERED
UNION
SELECT 'Friday' AS DAY_ENTERED
UNION
SELECT 'Saturday' AS DAY_ENTERED
UNION
SELECT 'Sunday' AS DAY_ENTERED)
SELECT ISNULL(A.TICKET_COUNT,0) AS TICKET_COUNT
, A.DATE_ENTERED
, B.DAY_ENTERED
FROM A
RIGHT OUTER JOIN B ON A.DAY_ENTERED = B.DAY_ENTERED
ORDER BY A.DATE_ENTERED ASC;
SET NOCOUNT OFF;
END;