【问题标题】:SQL Query - select 0 if no value availableSQL 查询 - 如果没有可用值,则选择 0
【发布时间】:2016-11-08 22:19:54
【问题描述】:

我在 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。所以我的输出应该包含星期四、星期五、星期六、星期日、星期一、星期二、星期三。

如何做到这一点?

【问题讨论】:

    标签: sql sql-server


    【解决方案1】:

    您需要为前几天建立一个日期表并对其执行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
    

    【讨论】:

    • 太棒了!但是,没有值的日期显示 TICKET_COUNT 为 1 而不是 0。
    • 这真的很奇怪 - 你能分享一些示例数据吗?
    • 使用count(T.Date_entered) 而不是count(*)
    • 没关系 - 发现问题。我已经更新了答案。 @vkp 是的,几乎忘记了外部连接。在我发布之前没有看到您的评论 - 谢谢!
    【解决方案2】:

    应该这样做:

    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;
    

    【讨论】:

    • 这几乎是完美的!但是,没有记录的日期显示 TICKET_COUNT 为 NULL 而不是零,并且 DATE_ENTERED 为空,而不是日期为 YYYY-MM-DD。有什么方法可以更新它来做到这一点吗?否则,如果我在这些日期的 DATE_ENTERED 为 NULL,则很难正确订购
    • 您可以使用 ISNULL() 函数,例如 ISNULL(TICKET_COUNT, 0),其中 0 是默认值
    • 这行得通,但它仍然在没有结果的记录上显示 DATE_ENTERED 为 NULL。谢谢你的帮助!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-25
    • 2019-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多