【问题标题】:Return zero value for all the month in series with count zero返回计数为零的所有月份的零值
【发布时间】:2016-01-30 21:55:20
【问题描述】:

这是我的查询:

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 月,依此类推...对于所有系列标签。如果该客户缺少任何刻度,则该月的值将为零。

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

【问题讨论】:

  • 使用的 Pleasa 标记 dbms 产品。 (那里有一些非 ANSI SQL...)
  • 你有一个月的帮助表吗?

标签: sql sql-server database common-table-expression


【解决方案1】:

肖先生,试试这个

;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

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

【讨论】:

  • 非常感谢阿迪什..通过一些小的更改,我能够获得所需的输出。干杯。
  • 很高兴知道。如果合适,请将其标记为已选答案。
【解决方案2】:
;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 表已创建,id 为 MonthNumber,Month_Name 为 Month。 干杯!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 2016-11-28
    • 1970-01-01
    相关资源
    最近更新 更多