2014-09-12 3 views
0

Во-первых, я не буду требовать особых знаний в SQL.TSQL 2 Запросы в 1

То, что я пытаюсь сделать, это сбить некоторые инциденты из базы данных SQL Server на основе нескольких различных критериев и поместить их в SSRS в линейной диаграмме, которая показывает ежемесячные подсчеты друг над другом. Оба запроса, которые я изначально создал, вытащили нужные данные, но SSRS не позволит использовать несколько наборов данных на одной диаграмме. Здесь я повесил трубку. Я уверен, что могу сделать какой-то подзапрос, чтобы получить оба набора данных в одном, просто отделяя подсчеты от столбцов, но то, что я пробовал до сих пор, суммирует все счета.

Данные, которые мне нужны, - это дата, которая является значением даты/времени и количеством инцидентов, которые произошли (нет необходимости собирать подсчеты или не должно быть, поскольку SSRS позволит мне группировать их по месяцам, на что должен выглядеть отчет), соответствующий каждому из двух критериев.

Ниже приведены два запроса, которые я использую:

SELECT DISTINCT v_Incident.ReportedDate, COUNT(*) AS Count 
FROM   v_Incident INNER JOIN 
         v_IncidentMaxWorkLog_Category ON v_Incident.IncidentID = v_IncidentMaxWorkLog_Category.Incident_Number 
WHERE  (v_Incident.Summary LIKE N'Intelligent Incident for Impacted CI%') AND (v_Incident.CustomerFirstName = N'BMC') AND 
         (v_Incident.CustomerLastName = N'Impact Manager') AND (v_IncidentMaxWorkLog_Category.WORK_LOG_TYPE IN ('General Information', 'Incident Task/Action', 
         'Working Log')) AND (v_Incident.ReportedDate >= '7/1/2014') AND (v_Incident.ReportedDate >= DATEADD(year, - 1, GETDATE())) 
GROUP BY v_Incident.ReportedDate 
FROM v_Incident 

Второй запрос

SELECT DISTINCT v_Incident.ReportedDate, COUNT(*) AS Count 
FROM   v_Incident INNER JOIN 
         v_IncidentMaxWorkLog_Category ON v_Incident.IncidentID = v_IncidentMaxWorkLog_Category.Incident_Number 
WHERE  (v_Incident.Summary LIKE N'Intelligent Incident for Impacted CI%') AND (v_Incident.CustomerFirstName = N'BMC') AND 
         (v_Incident.CustomerLastName = N'Impact Manager') AND (v_Incident.ReportedDate >= '7/1/2014') AND (v_Incident.ReportedDate >= DATEADD(year, - 1, GETDATE())) 
GROUP BY v_Incident.ReportedDate 
FROM v_Incident 

Как вы можете видеть, я потянув вниз reporteddate и подсчет. Если я просто объединяю эти два оператора в одном выражении [select (query1) как отфильтрованный, (query2) в качестве базы] и перемещаю группу за пределы, я получаю результаты, но это общая сумма для каждого значения на каждом одна строка, и около 10 тыс. строк слишком много.

Есть ли простое решение, которое даст мне каждую дату и один счетчик для базы и отфильтруется с использованием этих двух или подобных запросов? Заранее большое спасибо!

+1

Вы хотите, чтобы результаты были разбиты на результаты запроса или объединены?Как и в случае, если запрос 1 возвращает '1/1/2014, 10' и запрос 2 возвращает' 1/1/2014, 20' вы хотите '1/1/2014, 30' или вы хотите, чтобы он отображал дубликаты ? – Elias

+1

Он должен быть отделен, поэтому, если запрос 1 возвращает 1/1/2014, 10 и запрос 2 возвращает 1/1/2014, 20 он должен выводить 1/1/2014. BASE: 10 FILTERED: 20 – billhubb84

ответ

1

Ваши вопросы очень похожи. Похоже, что у вас есть общий счет, а затем частичный подсчет некоторых записей, имеющих конкретные типы журналов работы. Вот запрос, который возвращает дату, BaseCount и SSRS WorkLogFilteredCount, должен иметь возможность использовать дату как ось и два других столбца как отдельную серию очень легко для вашей диаграммы.

SELECT v_Incident.ReportedDate 
     , COUNT(*) AS BaseCount 
     , SUM(CASE WHEN v_IncidentMaxWorkLog_Category.WORK_LOG_TYPE IN ('General Information', 'Incident Task/Action', 'Working Log') THEN 1 ELSE 0 END) AS WorkLogFilteredCount 

FROM v_Incident 
     INNER JOIN v_IncidentMaxWorkLog_Category 
      ON v_Incident.IncidentID = v_IncidentMaxWorkLog_Category.Incident_Number 
WHERE (v_Incident.Summary LIKE N'Intelligent Incident for Impacted CI%') 
     AND (v_Incident.CustomerFirstName = N'BMC') 
     AND (v_Incident.CustomerLastName = N'Impact Manager') 
     AND (v_Incident.ReportedDate >= '7/1/2014') 
     AND (v_Incident.ReportedDate >= DATEADD(year, - 1, GETDATE())) 
GROUP BY v_Incident.ReportedDate 
FROM v_Incident 
+0

Это выглядит особенно эффективно для использования , в том числе, если мне необходимо внести изменения в требования в будущем. Однако, когда я пытаюсь выполнить запрос, я получаю синтаксическую ошибку для первого оператора FROM. Есть предположения? Основываясь на моем понимании t-sql, это выглядит правильно. Студия управления также сообщает, что SUM не является встроенной функцией, но это не ошибка при попытке выполнить запрос. Msg 156, Level 15, State 1, Line 5 Неверный синтаксис рядом с ключевым словом 'FROM'. – billhubb84

+0

Я поставил) в неправильном месте, но он отсутствует в конце вашего оператора case, и в правильном месте это утверждение работает достаточно эффективно. Единственное, что мне нужно сделать, чтобы довести это до конечного состояния, - это не подсчет подсчета. Для каждой записи, сделанной в журнале, у меня есть 2 записи в полноэкранном режиме, и это действительно должно быть 1. – billhubb84

1

Основываясь на том, что я думаю, что вы хотите, я собираюсь использовать UNION и обрабатывать объединенные запросы как subquery.

SELECT * 
FROM 
    ((SELECT DISTINCT 
      v_Incident.ReportedDate, COUNT(*) AS Count, 'BASE' as [Designator] 
     FROM    
      v_Incident 
     INNER JOIN 
      v_IncidentMaxWorkLog_Category ON v_Incident.IncidentID = v_IncidentMaxWorkLog_Category.Incident_Number 
     WHERE   
     (v_Incident.Summary LIKE N'Intelligent Incident for Impacted CI%') 
     AND (v_Incident.CustomerFirstName = N'BMC') 
     AND (v_Incident.CustomerLastName = N'Impact Manager') 
     AND (v_IncidentMaxWorkLog_Category.WORK_LOG_TYPE IN ('General Information', 'Incident Task/Action', 'Working Log')) 
     AND (v_Incident.ReportedDate >= '7/1/2014') 
     AND (v_Incident.ReportedDate >= DATEADD(year, - 1, GETDATE())) 
    GROUP BY 
     v_Incident.ReportedDate 
FROM v_Incident) 

UNION ALL 

(SELECT DISTINCT v_Incident.ReportedDate, COUNT(*) AS Count, 'Filtered' as [Designator] 
FROM   v_Incident INNER JOIN 
         v_IncidentMaxWorkLog_Category ON v_Incident.IncidentID = v_IncidentMaxWorkLog_Category.Incident_Number 
WHERE  (v_Incident.Summary LIKE N'Intelligent Incident for Impacted CI%') AND (v_Incident.CustomerFirstName = N'BMC') AND 
         (v_Incident.CustomerLastName = N'Impact Manager') AND (v_Incident.ReportedDate >= '7/1/2014') AND (v_Incident.ReportedDate >= DATEADD(year, - 1, GETDATE())) 
GROUP BY v_Incident.ReportedDate 
FROM v_Incident)) ORDER BY ReportedDate, Designator 
1
select isnull(a.ReportedDate, b.ReportedDate) ReportedDate, 
     a.Count ACount, b.Count BCount 
from 
(
    SELECT DISTINCT v_Incident.ReportedDate, COUNT(*) AS Count 
    FROM   v_Incident INNER JOIN 
          v_IncidentMaxWorkLog_Category ON v_Incident.IncidentID = v_IncidentMaxWorkLog_Category.Incident_Number 
    WHERE  (v_Incident.Summary LIKE N'Intelligent Incident for Impacted CI%') AND (v_Incident.CustomerFirstName = N'BMC') AND 
          (v_Incident.CustomerLastName = N'Impact Manager') AND (v_IncidentMaxWorkLog_Category.WORK_LOG_TYPE IN ('General Information', 'Incident Task/Action', 
          'Working Log')) AND (v_Incident.ReportedDate >= '7/1/2014') AND (v_Incident.ReportedDate >= DATEADD(year, - 1, GETDATE())) 
    GROUP BY v_Incident.ReportedDate 
    FROM v_Incident 
) a 
full outer join 
(
    SELECT DISTINCT v_Incident.ReportedDate, COUNT(*) AS Count 
    FROM   v_Incident INNER JOIN 
          v_IncidentMaxWorkLog_Category ON v_Incident.IncidentID = v_IncidentMaxWorkLog_Category.Incident_Number 
    WHERE  (v_Incident.Summary LIKE N'Intelligent Incident for Impacted CI%') AND (v_Incident.CustomerFirstName = N'BMC') AND 
          (v_Incident.CustomerLastName = N'Impact Manager') AND (v_Incident.ReportedDate >= '7/1/2014') AND (v_Incident.ReportedDate >= DATEADD(year, - 1, GETDATE())) 
    GROUP BY v_Incident.ReportedDate 
    FROM v_Incident 
) b on b.ReportedDate = a.ReportedDate 

Это относится к каждому из ваших первоначальных запросов, и помещает их в качестве «таблицы» в третий запрос, который соединяет их на ReportedDate. Он использует полное внешнее соединение, так что, если b отсутствует, a все равно будет извлечен, а также, если a отсутствует, b будет по-прежнему сообщаться. Таким образом, есть 3 комбинации:

  • а есть там, б равна нулю
  • а и б там
  • а является нулевым, а там Таким образом, чтобы получить ReportedDate в использовании результата ISNULL для отображения a.ReportedDate и является нулевым (пример 3 выше), используйте b.ReportedDate.

Помните, что в любом SQL Select вы можете заменить имя таблицы на запрос Select.