SQL查询 - 如果没有可用值,则选择0

时间:2016-07-06 18:28:23

标签: sql sql-server

我在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

它将显示类似于以下的输出...

enter image description here

我希望它能够显示前几周的票数(今天和之前的6天),即使有些日期没有输入票证。它只会显示0。所以我的输出看起来包含周四,周五,周六,周日,周一,周二,周三。

如何实现这一目标?

2 个答案:

答案 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;