2015-09-14 3 views
1

Я ищу, чтобы отображать значения NULL в виде пробелов или тире, чтобы облегчить чтение результирующего набора данных, поскольку диапазон дат может отличаться. Например, для диапазона дат 10 дней я мог получать значения NULL для 5 из 10 дней для часов человека. Я просто хочу, чтобы эти значения NULL были пустыми, если у человека нет часов на этот день.Значения NULL в динамическом сводном запросе

Я видел примеры использования ISNULL на сводных таблицах, но не динамическую сводную таблицу. Мне интересно, как указать замену NULL для моего динамического списка дат, заполненных в @PivotColumns.

В моем примере запроса ниже, я опустил, не соответствующий код, такие как соединения и другие информационные колонны и т.д.

SELECT 
@PivotColumns = COALESCE(@PivotColumns + ',','') + QUOTENAME(CONVERT(varchar(20),eff_date,110)) 
FROM 
(SELECT DISTINCT 
    eff_date 
FROM 
    timept 
WHERE 
    eff_date 
     BETWEEN 
    @StartDate AND @EndDate) AS TimePivot 
ORDER BY 
eff_date 

SET 
@TimeQuery = 
    'WITH Hours AS (
     SELECT 
      ,tp.person_id 
      ,tp.hours 
      ,tp.task_code 
      ,tp.eff_date 
      ,SUM(tp.hours) OVER(PARTITION BY tp.person_id, edr.name, tp.task_code, tp.comments ORDER BY tp.task_code) AS sum_hours 
     FROM 
      tables 
     WHERE 
      tp.eff_date BETWEEN ''' + @StartDate + ''' AND ''' + @EndDate + ''' 
      ) 
     SELECT 
      * 
     FROM 
      Hours 
      PIVOT 
       (SUM(hours) 
        FOR 
       eff_date 
        IN 
       ('[email protected]+')) as p' 

EXEC sp_executesql @TimeQuery 
+0

MySQL или SQL сервер ?? Это не одно и то же. –

+0

Я смущен относительно того, какие значения NULL дают вам проблемы. Как насчет вашего текущего запроса не работает должным образом? – larsts

+0

Это сервер sql. Также значения NULL не являются проблемами, я просто хотел бы, чтобы они отображались как пустые или тире, чтобы облегчить чтение для конечных пользователей. –

ответ

1

Попробуйте это:

@TimeQuery = 
' WITH Hours AS (
    SELECT 
     ,tp.person_id 
     ,ISNULL(tp.hours, '''') 
     ,tp.task_code 
     ,ISNULL(tp.eff_date, '''') 
     ,SUM(tp.hours) OVER(PARTITION BY tp.person_id, edr.name, tp.task_code, tp.comments ORDER BY tp.task_code) AS sum_hours 
    FROM 
     tables 
    WHERE 
     tp.eff_date BETWEEN ''' + @StartDate + ''' AND ''' + @EndDate + ''' 
     ) 
    SELECT 
     * 
    FROM 
     Hours 
     PIVOT 
      (SUM(hours) 
       FOR 
      eff_date 
       IN 
      ('+ @PivotColumns +')) as p' 
+0

Этот метод все еще производит значения NULL. –