2014-10-30 2 views
0

Я пытаюсь отображать статусы для идентификаторов somes, хранящихся в БД. Все работает, но мне также нужно показывать пустые точки. Они должны отображаться как промежуток между статусами, в которых на самом деле есть идентификаторы. Следующий запрос определяет отображаемые данные:Показать пустую точку в столбчатой ​​диаграмме

SELECT [SnapshotTime] 
    ,[Id] 
    ,[Status] 
FROM [Features] 
WHERE (Status = '0_BB' 
OR Status = '1_RT' 
OR Status = '2_AA' 
OR Status = '3_EC' 
OR Status = '4_FD' 
OR Status = '5_ID' 
OR Status = '6_DR' 
OR Status = '7_finished') 
AND 
([SnapshotTime] = (SELECT MAX([SnapshotTime]) FROM [Features])) 
AND (FeatureSet = @System OR @System = 'ALL') 

@System - это параметр, доступный для пользователя. Например. «ВСЕ» предоставят все системы. Теперь мне нужно принудительное отображение всех статусов. Если статус «2_AA» не содержит идентификаторов, этот запрос приведет к тому, что гистограмма просто исключает этот статус, но я хочу, чтобы все было показано (тогда нет бара, но пробел, указывающий, что в этом статусе нет идентификатора).

Я попытался получить значения EmptyPoint, но просто нет нулевых значений, поэтому это не поможет. DataTable, содержащий жестко закодированные строки для всех состояний, похоже на решение, но я не знаю, как вставлять и объединять это в этот запрос или отчет. Поэтому, пожалуйста, помогите мне с принудительными пустыми значениями.

ответ

0

Ответ от Тино привел меня на правый переулок. Следующий код соответствует моим потребностям:

DECLARE @Statuses table(
SnapshotTime varchar(255), 
Id varchar(255), 
Status varchar(255)); 

INSERT INTO @Statuses(SnapshotTime,Id,Status) 
VALUES ('-1',NULL,'2_AA'); 
INSERT INTO @Statuses(SnapshotTime,Id,Status) 
VALUES ('-1',NULL,'3_EC'); 
INSERT INTO @Statuses(SnapshotTime,Id,Status) 
VALUES ('-1',NULL,'4_FD'); 
INSERT INTO @Statuses(SnapshotTime,Id,Status) 
VALUES ('-1',NULL,'5_ID'); 
INSERT INTO @Statuses(SnapshotTime,Id,Status) 
VALUES ('-1',NULL,'6_DR'); 

SELECT [SnapshotTime] 
     ,[Id] 
     ,[Status] 
    FROM [Features] 
    WHERE (Status = '0_BB' 
    OR Status = '1_RT' 
    OR Status = '2_AA' 
    OR Status = '3_EC' 
    OR Status = '4_FD' 
    OR Status = '5_ID' 
    OR Status = '6_DR' 
    OR Status = '7_finished' 
) 
    AND 
    ([SnapshotTime] = (SELECT MAX([SnapshotTime]) FROM [Features])) 
    AND (FeatureSet = @System OR @System = 'ALL') 
UNION ALL 
    SELECT [SnapshotTime] 
     ,[Id] 
     ,[Status] 
    FROM @Statuses 

Я уверен, что это не будет работать без adding EmptyPoint properties.

1

Вы можете присоединиться к другой таблице, содержащее все статусы, а также использовать ISNULL когда нет SnapshotTime:

SELECT 
    ISNULL(f.[SnapshotTime], 0), f.[Id], s.[Status] 
FROM 
    [Features] AS f 
    RIGHT JOIN [Statuses] AS s 
     ON 
      f.[Status] = s.[Status] 
WHERE 
    ([SnapshotTime] = (SELECT MAX([SnapshotTime]) FROM [Features])) AND 
    (FeatureSet = @System OR 
     @System = 'ALL') 

Это всегда будет показывать все состояние, и показать 0, если нет SnapshotTime не доступно.

Не протестировали код, хотя и отредактировали его.

+0

Не могли бы вы рассказать мне, как добавить таблицу со всеми статусами? В наборах данных? Я застрял на этом. – EngJon

+0

Где находится таблица ваших функций? Просто создайте там новую таблицу, содержащую все статусы. –

+0

Таким образом, нет возможности добавить данные к самому отчету? Хорошо, я посмотрю, смогу ли я создать таблицу в БД – EngJon