Return 计数为零的所有月份的零值

Return zero value for all the month in series with count zero

这是我的查询:

SELECT STAFF.stf_first_name + '' + STAFF.stf_last_name As Name,
       DATENAME(month,RES_HAB_DATA.reshabdata_data_date) As Month,
       SUM(case when RES_HAB_DATA.reshabdata_duration > 0
                then (RES_HAB_DATA.reshabdata_duration/15) else 0 end) As ServiceDeliveryTime,
       MONTH(RES_HAB_DATA.reshabdata_data_date) As MonthNumber 
FROM RES_HAB_DATA
  JOIN RES_HAB ON RES_HAB_DATA.reshab_id = RES_HAB.reshab_id
  JOIN STAFF ON RES_HAB_DATA.staff_id = STAFF.stf_id
WHERE RES_HAB.serv_id = 30
  AND RES_HAB_DATA.reshabdata_data_date >= '1/1/2015'
GROUP BY STAFF.stf_last_name,
         STAFF.stf_first_name,
         DATENAME(month,RES_HAB_DATA.reshabdata_data_date),
         MONTH(RES_HAB_DATA.reshabdata_data_date)
ORDER BY MonthNumber

产生的结果集为:

Name                         Month      ServiceDeliveryTime     MonthNumber
----------------------------------------------------------------------------
mb                           January             52                 1
MikeCasey                    January             10                 1
MikeCasey                    February            4                  2
PrecisionCareSupport         February            0                  2
MikeCasey                    March               4                  3
PrecisionCareSupport         March               0                  3
MikeCasey                    April               8                  4
PrecisionCareSupport         April               0                  4
MikeCasey                    May                 16                 5
MikeCasey                    July                4                  7
PrecisionCareSupport         July                1                  7
PrecisionCareSupport         August              0                  8
MikeCasey                    September           10                 9
MikeCasey                    October             12                 10

我正在生成图表并想为该图表生成系列,但系列的形成方式应使每个系列标签必须具有所有刻度值(如果缺少相应月份则为零)。简单来说,我希望结果集为:

Name                         Month      ServiceDeliveryTime     MonthNumber
----------------------------------------------------------------------------
mb                           January             52                 1
mb                           February            0                  2
mb                           March               0                  3
mb                           April               0                  4
-                              -                 0                  5

到 12 月,客户 MikeCasey 的系列将继续到 12 月,依此类推...对于所有系列 Labels.If 该客户缺少任何勾号,该月的值为零。

如何生成这个结果集?我想要一些统一的解决方案,因为对于不同的图表可能会有很多这样的查询。

肖先生,试试这个

;WITH 
(SELECT STAFF.stf_first_name + '' + STAFF.stf_last_name As Name,
       DATENAME(month,RES_HAB_DATA.reshabdata_data_date) As Month,
       SUM(case when RES_HAB_DATA.reshabdata_duration > 0
            then (RES_HAB_DATA.reshabdata_duration/15) else 0 end) As ServiceDeliveryTime,
       MONTH(RES_HAB_DATA.reshabdata_data_date) As MonthNumber 
 FROM RES_HAB_DATA
  JOIN RES_HAB ON RES_HAB_DATA.reshab_id = RES_HAB.reshab_id
  JOIN STAFF ON RES_HAB_DATA.staff_id = STAFF.stf_id
WHERE RES_HAB.serv_id = 30
    AND RES_HAB_DATA.reshabdata_data_date >= '1/1/2015'
GROUP BY STAFF.stf_last_name,
     STAFF.stf_first_name,
     DATENAME(month,RES_HAB_DATA.reshabdata_data_date),
     MONTH(RES_HAB_DATA.reshabdata_data_date)
) AS mytable
SELECT 
    myTableName.Name
    ,mytableMonth.Month
    ,ISNULL(mytable.ServiceDeliveryTime,0)
    ,mutableMonth.MonthNumber
FROM
    (SELECT DISTINCT Name from mytable) mytableName
    CROSS JOIN (SELECT DISTINCT Month,MonthNumber FROM mytable) mytableMonth
    LEFT INNER JOIN mytable ON mytableName.Name = mytable.Name AND mytableMonth.Month = mytable.Month AND mytableMonthNumber = mytable.MonthNumber
ORDER BY mytableName.Name, mytableMonth.MonthNumber

我已经从您的数据中提取了所有不同的月份和名称并进行了交叉连接。

;WITH mytable(Name,Month,ServiceDeliveryTime,MonthNumber) AS
(
SELECT STAFF.stf_first_name + '' + STAFF.stf_last_name As Name,
   DATENAME(month,RES_HAB_DATA.reshabdata_data_date) As Month,
   SUM(case when RES_HAB_DATA.reshabdata_duration > 0
        then (RES_HAB_DATA.reshabdata_duration/15) else 0 end) As ServiceDeliveryTime,
   MONTH(RES_HAB_DATA.reshabdata_data_date) As MonthNumber 
 FROM RES_HAB_DATA
JOIN RES_HAB ON RES_HAB_DATA.reshab_id = RES_HAB.reshab_id
JOIN STAFF ON RES_HAB_DATA.staff_id = STAFF.stf_id
WHERE RES_HAB.serv_id = 30
AND RES_HAB_DATA.reshabdata_data_date >= '1/1/2015'
GROUP BY STAFF.stf_last_name,
 STAFF.stf_first_name,
 DATENAME(month,RES_HAB_DATA.reshabdata_data_date),
 MONTH(RES_HAB_DATA.reshabdata_data_date)
) 
SELECT 
myTableName.Name
,mytableMonth.Month_Name
,ISNULL(mytable.ServiceDeliveryTime,0) as ServiceDeliveryTime
,mytableMonth.id
FROM
(SELECT DISTINCT Name from mytable) mytableName
CROSS JOIN (SELECT DISTINCT Month_Name,id FROM MyMonths)  mytableMonth
LEFT JOIN mytable ON mytableName.Name = mytable.Name AND mytableMonth.Month_Name = mytable.Month AND mytable.MonthNumber = mytable.MonthNumber
ORDER BY mytableName.Name, mytableMonth.id

MyMonths table 已创建 table,id 为 MonthNumber,Month_Name 为 Month。 干杯!