如何显示记录的所有日子



我在sql Server中有一个名为Lab_Analysis(ID int,Date Date,HeatNo decimal(18,3),Mn decimal(18,3),CaO decimal(18,3))

的表

现在,如果我想查看MN,MN,CAO的总和,那么我将不得不进入一个月和年。假设我给出一个月= 2(表示2月),然后应显示该月每个天的Heatno,MN,CAO的总和,如果在任何日子里找不到任何记录,则应进行0。P>

Declare @D table(Dt int,Val decimal(18,3))
insert into @D values(1,0),(2,0),(3,0),(4,0),(5,0),(6,0),(7,0),(8,0),(9,0), 
(10,0),(11,0),(12,0),(13,0),(14,0),(15,0),(16,0),(17,0),(18,0),(19,0), 
(20,0),(21,0),(22,0),(23,0),(24,0),(25,0),(26,0),(27,0),(28,0),(29,0),(30,0),(31,0)
SELECT D.Dt,ISNULL(SUM(L.HeatNo),0) HeatNo FROM @D D LEFT JOIN Lab_Analysis 
L ON DATEPART(dd,L.Date)=D.Dt where DATEPART(MM,L.Date)=2 GROUP BY D.Dt

在2月份的记录中仅在2月11日至13日插入。上面的查询仅显示行,但显示了整天的记录。如果在任何日子都找不到记录,则应显示上述查询未显示的0。如何解决这个问题?

您在WHERE子句datePart(mm,l.date)= 2中使用L.date,将您的左键转换为内部加入,您需要在中添加此条件on子句

Declare @D table(Dt int,Val decimal(18,3))
insert into @D values(1,0),(2,0),(3,0),(4,0),(5,0),(6,0),(7,0),(8,0),(9,0), 
(10,0),(11,0),(12,0),(13,0),(14,0),(15,0),(16,0),(17,0),(18,0),(19,0), 
(20,0),(21,0),(22,0),(23,0),(24,0),(25,0),(26,0),(27,0),(28,0),(29,0),(30,0),(31,0)
SELECT D.Dt,ISNULL(SUM(L.HeatNo),0) HeatNo 
FROM @D D 
LEFT JOIN Lab_Analysis L ON 
    DATEPART(dd,L.Date)=D.Dt 
    AND DATEPART(MM,L.Date)=2 
GROUP BY D.Dt

,我建议您使用CTE创建您的日期

,而不是每月创建一组值
DECLARE 
    @Year INT, 
    @Month INT, 
    @start DATE, 
    @end DATE
SET @Year = 2019
SET @Month = 2
SET @start = DATEFROMPARTS(@Year, @Month, 1)
SET @end = DATEADD(day, -1,DATEADD(month, 1, @start))
;WITH dates AS (
    SELECT @start as theDate
    UNION ALL
    SELECT DATEADD(day, 1, theDate)
    FROM dates 
    WHERE DATEADD(day, 1, theDate) <= @end
)
SELECT D.theDate,ISNULL(SUM(L.HeatNo),0) HeatNo 
FROM dates D
LEFT JOIN Lab_Analysis L ON L.Date = theDate
GROUP BY theDate

最新更新