Sql server 即使值为空,也显示所有月份

Sql server 即使值为空,也显示所有月份,sql-server,Sql Server,你好!我正在制作一个图表,其中我需要显示一年中的所有月份,以显示每月的销售额。到目前为止,我只能显示有相应值的月份。这是我到目前为止的存储过程查询 SELECT (DATENAME (MONTH, DATEADD ( MONTH, DATEPART(MONTH, ORDER_DATE), -1) )) AS MONTH_NAME, SUM ([ORDER].NET_AMOUNT) AS TOTAL_SALES FROM [ORDER], ORDER_DETAILS WHERE [OR

你好!我正在制作一个图表,其中我需要显示一年中的所有月份,以显示每月的销售额。到目前为止,我只能显示有相应值的月份。这是我到目前为止的存储过程查询

SELECT (DATENAME (MONTH, DATEADD ( MONTH, DATEPART(MONTH, ORDER_DATE), -1) ))
AS MONTH_NAME,
  SUM ([ORDER].NET_AMOUNT) AS TOTAL_SALES
  FROM [ORDER], ORDER_DETAILS
  WHERE [ORDER].ORDER_ID = ORDER_DETAILS.ORDER_ID
  --AND (DATENAME (MONTH, DATEADD ( MONTH, DATEPART(MONTH, ORDER_DATE), -1) )) = (DATENAME (MONTH, DATEADD ( MONTH, DATEPART(MONTH, @Order_month), -1) )) 
  GROUP BY MONTH([ORDER].ORDER_DATE)
  ORDER BY MONTH_NAME
它仅显示1个月以及该月的销售额。有人能帮我吗?提前感谢

试试这个:

SELECT (DATENAME (MONTH, DATEADD ( MONTH, DATEPART(MONTH, ORDER_DATE), -1) ))
AS MONTH_NAME,
  SUM ([ORDER].NET_AMOUNT) AS TOTAL_SALES
  FROM [ORDER], ORDER_DETAILS
  WHERE [ORDER].ORDER_ID(+) = ORDER_DETAILS.ORDER_ID
  --AND (DATENAME (MONTH, DATEADD ( MONTH, DATEPART(MONTH, ORDER_DATE), -1) ))            = (DATENAME (MONTH, DATEADD ( MONTH, DATEPART(MONTH, @Order_month), -1) )) 
  GROUP BY MONTH([ORDER].ORDER_DATE)
  ORDER BY MONTH_NAME
试试这个:

SELECT (DATENAME (MONTH, DATEADD ( MONTH, DATEPART(MONTH, ORDER_DATE), -1) ))
AS MONTH_NAME,
  SUM ([ORDER].NET_AMOUNT) AS TOTAL_SALES
  FROM [ORDER], ORDER_DETAILS
  WHERE [ORDER].ORDER_ID(+) = ORDER_DETAILS.ORDER_ID
  --AND (DATENAME (MONTH, DATEADD ( MONTH, DATEPART(MONTH, ORDER_DATE), -1) ))            = (DATENAME (MONTH, DATEADD ( MONTH, DATEPART(MONTH, @Order_month), -1) )) 
  GROUP BY MONTH([ORDER].ORDER_DATE)
  ORDER BY MONTH_NAME

创建月份表

    Create table #months
    (
    monthid int,
    monthname varchar(100)
    )

    insert into #monthids
    (monthid,monthname)
    values
    (1,'January'),(2,'February')...insert upto 12 months


;with cte
as
(
SELECT 
(DATENAME (MONTH, DATEADD ( MONTH, DATEPART(MONTH, ORDER_DATE), -1) ))
AS MONTH_NAME,
SUM ([ORDER].NET_AMOUNT) AS TOTAL_SALES
FROM [ORDER], ORDER_DETAILS
WHERE [ORDER].ORDER_ID = ORDER_DETAILS.ORDER_ID
(DATENAME (MONTH, DATEADD ( MONTH, DATEPART(MONTH, @Order_month), -1) )) 
GROUP BY MONTH([ORDER].ORDER_DATE)
)
select 
m.Monthname,
isnull(total_Sales,0) as 'totalSales'
from #months m
Left join
cte c
on c.monthname=m.month_name

创建月份表

    Create table #months
    (
    monthid int,
    monthname varchar(100)
    )

    insert into #monthids
    (monthid,monthname)
    values
    (1,'January'),(2,'February')...insert upto 12 months


;with cte
as
(
SELECT 
(DATENAME (MONTH, DATEADD ( MONTH, DATEPART(MONTH, ORDER_DATE), -1) ))
AS MONTH_NAME,
SUM ([ORDER].NET_AMOUNT) AS TOTAL_SALES
FROM [ORDER], ORDER_DETAILS
WHERE [ORDER].ORDER_ID = ORDER_DETAILS.ORDER_ID
(DATENAME (MONTH, DATEADD ( MONTH, DATEPART(MONTH, @Order_month), -1) )) 
GROUP BY MONTH([ORDER].ORDER_DATE)
)
select 
m.Monthname,
isnull(total_Sales,0) as 'totalSales'
from #months m
Left join
cte c
on c.monthname=m.month_name

首先,请使用正确的连接语法和别名

您可以使用月份创建CTE,使用输出创建CTE,并加入它们:

;WITH mcte AS (
    SELECT CAST('2016-01-01' as datetime) as MONTH_NAME
    UNION ALL
    SELECT DATEADD(MONTH,1,MONTH_NAME)
    FROM mcte
    WHERE DATEPART(MONTH,MONTH_NAME) < 12
), octe AS (
    SELECT  (DATENAME (MONTH, DATEADD ( MONTH, DATEPART(MONTH, ORDER_DATE), -1) )) AS MONTH_NAME,
            SUM (o.NET_AMOUNT) AS TOTAL_SALES
    FROM [ORDER] o
    INNER JOIN ORDER_DETAILS od
        ON o.ORDER_ID = od.ORDER_ID
        --AND (DATENAME (MONTH, DATEADD ( MONTH, DATEPART(MONTH, ORDER_DATE), -1) )) = (DATENAME (MONTH, DATEADD ( MONTH, DATEPART(MONTH, @Order_month), -1) )) 
    GROUP BY MONTH(o.ORDER_DATE)
)


SELECT  DATENAME(MONTH,m.MONTH_NAME) as MONTH_NAME,
        o.TOTAL_SALES
FROM mcte m
LEFT JOIN octe o
    ON o.MONTH_NAME = DATENAME(MONTH,m.MONTH_NAME)

这将给出所有月份的名称和所有总销售额,如果没有总销售额-它将显示空值。

首先请使用正确的联接语法和别名

您可以使用月份创建CTE,使用输出创建CTE,并加入它们:

;WITH mcte AS (
    SELECT CAST('2016-01-01' as datetime) as MONTH_NAME
    UNION ALL
    SELECT DATEADD(MONTH,1,MONTH_NAME)
    FROM mcte
    WHERE DATEPART(MONTH,MONTH_NAME) < 12
), octe AS (
    SELECT  (DATENAME (MONTH, DATEADD ( MONTH, DATEPART(MONTH, ORDER_DATE), -1) )) AS MONTH_NAME,
            SUM (o.NET_AMOUNT) AS TOTAL_SALES
    FROM [ORDER] o
    INNER JOIN ORDER_DETAILS od
        ON o.ORDER_ID = od.ORDER_ID
        --AND (DATENAME (MONTH, DATEADD ( MONTH, DATEPART(MONTH, ORDER_DATE), -1) )) = (DATENAME (MONTH, DATEADD ( MONTH, DATEPART(MONTH, @Order_month), -1) )) 
    GROUP BY MONTH(o.ORDER_DATE)
)


SELECT  DATENAME(MONTH,m.MONTH_NAME) as MONTH_NAME,
        o.TOTAL_SALES
FROM mcte m
LEFT JOIN octe o
    ON o.MONTH_NAME = DATENAME(MONTH,m.MONTH_NAME)


这将给出所有月份的名称和所有总销售额,如果没有总销售额-它将显示空值。

如果缺少的月份不是数据集的一部分,那么您将不得不以某种方式引入该数据,可能需要使用日历表。我将处理该问题。谢谢你,先生!视线迂回…您的连接语法已经过时近30年了。也许是时候考虑使用更现代风格的连接了。GROUP BY MONTHo.ORDER_DATE的一个潜在问题是,如果项目来自不同年份的同一个月数,它会将项目分组在一起。如果缺少的月份不属于数据集的一部分,那么您将不得不以某种方式引入该数据,可能需要使用日历表。我将对此进行研究。谢谢你,先生!视线迂回…您的连接语法已经过时近30年了。也许是时候考虑使用更现代风格的连接了。GROUP BY MONTHo.ORDER_DATE的一个潜在问题是,如果项目来自不同年份的同一个月号,它会将项目分组在一起!我试过了,但它说,**附近的语法不正确**这个+是用来干什么的?对不起,我错了,它不是oracle,您使用的是sql server。你应该使用游戏ISWAR的答案嗨!我试过了,但它说,**附近的语法不正确**这个+是用来干什么的?对不起,我错了,它不是oracle,您使用的是sql server。你应该使用GameIswar的答案是months just temp table?是的,根据你的数据,你也可以创建一个永久表,选择m.Monthname,isnulltotal_Sales,0作为“totalSales”,从monthids m cte c on c.Monthname=m.month_name,我将其传递给一个JsonResult方法,因为“totalSales”,我将通过3个参数?@KylieIrwin:你能详细说明一下它的月份只是一个临时表吗?是的,根据你的数据,你也可以创建一个永久表,选择m.Monthname,isnulltotal_Sales,0作为“totalSales”,从monthids m cte c到c.Monthname=m.month_name,我将它传递给一个JsonResult方法,我将通过3个参数,因为“totalSales”?@KylieIrwin:你能详细说明一下吗?@gofr1!这行m.datenamemount,MONTH\u NAME有问题。错误表示找不到列m或用户定义函数或聚合m.DATENAME,或者名称不明确!对不起,是我的打字错误。在o.MONTH\u NAME=m.datenamemount,MONTH\u NAME应该在o.MONTH\u NAME=datenamemount,m.MONTH\u NAME,在我的答案中更改!嗨@gofr1!这帮我完成了任务,问题是,它以datetime格式显示月份名称。我需要它显示为月份名称本身。我试图改变这一行,选择“2016-01-01”作为datetime作为MONTH_NAME,但我似乎没能正确理解。嗨@gofr1!这行m.datenamemount,MONTH\u NAME有问题。错误表示找不到列m或用户定义函数或聚合m.DATENAME,或者名称不明确!对不起,是我的打字错误。在o.MONTH\u NAME=m.datenamemount,MONTH\u NAME应该在o.MONTH\u NAME=datenamemount,m.MONTH\u NAME,在我的答案中更改!嗨@gofr1!这帮我完成了任务,问题是,它以datetime格式显示月份名称。我需要它显示为月份名称本身。我试图改变这一行,选择“2016-01-01”作为datetime作为MONTH_NAME,但我似乎无法正确地理解。