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

SQL查询-如果没有可用值,请选择0,sql,sql-server,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(w

我在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。因此,我的输出将包含周四、周五、周六、周日、周一、周二、周三


如何实现这一点?

您需要为前几天构建一个日期表,并对其进行正确连接:

这应该做到:

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;

那几乎是完美的!但是,没有记录的天数显示票证计数为NULL而不是零,并且输入的日期为NULL,而不是YYYY-MM-DD。我是否可以通过某种方式更新此值?否则,如果在这些日期输入的日期为空,则很难正确排序。您可以使用ISNULL函数,如ISNULLTICKET\u COUNT,0,其中0是默认值。该函数有效,但在没有结果的记录中输入的日期仍然显示空。谢谢你的帮助!太棒了!但是,没有值的日期显示票证计数为1而不是0。这真的很奇怪-您可以共享一些示例数据吗?使用countT.Date\u输入而不是COUNT*。Nevermind-发现问题。我已经更新了答案@vkp是的,一半忘了它的外部连接。在我发布之前没有看到你的评论-谢谢!
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;