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,但我似乎无法正确地理解。