如何获取所有月份名称并需要显示月份数据

时间:2018-11-05 12:01:32

标签: sql sql-server

Pnum    Fdate           description
====    ==========      ===========
1024    2018-02-17      A
1024    2018-05-17      B
1024    2018-05-17      C
1024    2018-09-17      D

MY表PW的字段如下所示。 ->我想将结果显示为

**Month Name    Description**
January       -
February      A
March         -
April         -
May           B
June          -
July          -
August        C
September     D
October       -
November      -
December      -

请帮助我如何实现这一目标。

5 个答案:

答案 0 :(得分:1)

加入一个月名称列表,其中只有十二个:

Random

答案 1 :(得分:0)

您可以在下面尝试

DEMO

with cte1 as (
      select cast('2018-01-01' as date) dt
      union all
      select dateadd(month, 1, dt)
      from cte1 
      where dateadd(month, 1, dt) < cast('2018-12-31' as date)
     )

select DateName(month,dt),coalesce(Description,'-') as Description from cte1 a left join yourtable b 
on month(a.dt)=month(b.Fdate)

答案 2 :(得分:0)

尝试以下查询:

SELECT MONTHNAME(fdate), description FROM table

有关更多参考,请通过 https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_month

答案 3 :(得分:0)

尝试一下

;WITH CTE(Pnum,  Fdate,description)
AS
(
SELect 1024,'2018-02-17','A' union all
SELect 1024,'2018-05-17','B' union all
SELect 1024,'2018-08-17','C' union all
SELect 1024,'2018-09-17','D' 
)
SELECT MonthNames,ISNULL([Description],'-') AS [Description]
FROM CTE RIGHT JOIN
(
    SELECT DATENAME(MONTH,DATEADD(MONTH,number-datepart(month,GETDATE()),GETDATE())) as MonthNames
    FROM MASTER.DBO.spt_values
    WHERE TYPE ='P'
     AND number BETWEEN 1 AND 12
 ) dt 
ON dt.MonthNames=DATENAME(MONTH,Fdate)

结果

MonthNames  Description
--------------------------
January     -
February    A
March       -
April       -
May         B
June        -
July        -
August      C
September   D
October     -
November    -
December    -

答案 4 :(得分:0)

此解决方案将允许使用Fdate上的索引(MONTH(column)会强制每次扫描)。

DECLARE @year int = 2018;

;WITH m AS
(
  SELECT m = 1 UNION ALL SELECT m + 1 FROM m WHERE m < 12
),
months(b,e) AS
(
  SELECT b = DATEFROMPARTS(@year, m,   1)
  FROM m
)
SELECT DATENAME(MONTH, m.b), PW.Description
FROM months AS m
LEFT OUTER JOIN dbo.PW 
ON PW.Fdate >= m.b AND PW.Fdate < DATEADD(MONTH, 1, m.b)
ORDER BY m.b;