SQL查询-如果没有可用值,请选择0
我在SQL Server 2012中创建了以下存储过程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
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;