Объединение двух запросов SQL, которые возвращают различное количество строк - PullRequest
0 голосов
/ 16 апреля 2019

Мне нужно объединить два набора данных (запросы) в один набор данных для отчета SSRS.Они оба передают один и тот же параметр для получения результатов, но проблема в том, что они возвращают разное количество результатов, потому что вы передаете строку, содержащую идентификаторы, разделенные разделителем, и каждый запрос возвращает результаты для всех идентификаторов, переданных в параметре.

Первому запросу передается параметр, например, @Sem_ID = '137210;137211'

SELECT Sem_ID, Sem_KW, Sem_Jahr, Sem_SemNrKata, Sem_von, Sem_bis, h.chr_name, h.chr_ort
FROM acc_seminar.t_Seminar
JOIN dbo.tbl_hotel h ON Sem_Ht_ID=h.pk_hotel
WHERE Sem_ID IN (SELECT value  
FROM fn_Split(@Sem_ID, ';')  
WHERE RTRIM(value) <> '') AND (Sem_SemTh_ID != 76 AND Sem_Sto = 0)

, который возвращает одну строку для каждого значения в @Sem_ID: ID 137210 и ID 137211.

enter image description here

Второй запрос передает тот же параметр и возвращает несколько строк: например, я получаю 7 строк в результатах: 5 для идентификатора 137210 и 2 для идентификатора 137211.

SELECT tu.TU_Name AS Name, tu.TU_Vorname AS Vorname, ParkgebuehrBrutto AS Preis
FROM acc_seminar.t_Teiluber_Ext tux
JOIN acc_seminar.t_Teiluber tu ON tux.TeiluberId = tu.TU_ID
JOIN acc_seminar.t_Seminar s ON tu.TU_Sem_ID = s.Sem_ID
WHERE s.Sem_ID IN (SELECT value  
                   FROM fn_Split(@Sem_ID, ';')  
                   WHERE RTRIM(value) <> '')
  AND ParkgebuehrBrutto IS NOT NULL

enter image description here

Мне нужно как-то объединить эти запросы, чтобы у меня был один запрос, который передается в отчете.

Я пытался использовать UNION, но количество столбцов в обоих запросах различается.Есть предложения?

Ответы [ 2 ]

1 голос
/ 16 апреля 2019

Еще один вариант объединения двух наборов записей:

;WITH cte1 AS(
  SELECT Sem_ID, Sem_KW, Sem_Jahr, Sem_SemNrKata, Sem_von, Sem_bis, h.chr_name, h.chr_ort, ROW_NUMBER()OVER(ORDER BY Sem_ID) N
  FROM acc_seminar.t_Seminar
  JOIN dbo.tbl_hotel h ON Sem_Ht_ID=h.pk_hotel
  WHERE Sem_ID IN (SELECT value  
  FROM fn_Split(@Sem_ID, ';')  
  WHERE RTRIM(value) <> '') AND (Sem_SemTh_ID != 76 AND Sem_Sto = 0)
),
cte2 AS(
  SELECT tu.TU_Name AS Name, tu.TU_Vorname AS Vorname, ParkgebuehrBrutto AS Preis, ROW_NUMBER()OVER(ORDER BY tu.TU_Name) N
  FROM acc_seminar.t_Teiluber_Ext tux
  JOIN acc_seminar.t_Teiluber tu ON tux.TeiluberId = tu.TU_ID
  JOIN acc_seminar.t_Seminar s ON tu.TU_Sem_ID = s.Sem_ID
  WHERE s.Sem_ID IN (SELECT value  
                     FROM fn_Split(@Sem_ID, ';')  
                     WHERE RTRIM(value) <> '')
    AND ParkgebuehrBrutto IS NOT NULL
)
SELECT
  cte1.Sem_ID, cte1.Sem_KW, cte1.Sem_Jahr, cte1.Sem_SemNrKata, cte1.Sem_von, cte1.Sem_bis, cte1.chr_name, cte1.chr_ort,
  cte2.Name,cte2.Vorname,cte2.Preis
FROM cte1
FULL JOIN cte2 ON cte1.N=cte2.N
ORDER BY ISNULL(cte1.N,cte2.N)

Но я не понимаю, почему вы не используете два разных набора данных в своем отчете?

1 голос
/ 16 апреля 2019

Надеюсь, я вас правильно понял.

-- query 1
SELECT
  col1,
  col2,
  col3,
  col4,
  NULL col5 -- this column is not exist in the query 1
FROM ...

UNION ALL

-- query 2
SELECT
  NULL col1, -- this column is not exist in the query 2
  col2,
  col3,
  NULL col4, -- this column is not exist in the query 2
  col5
FROM ...

Ваши запросы с UNION ALL:

SELECT
  Sem_ID, Sem_KW, Sem_Jahr, Sem_SemNrKata, Sem_von, Sem_bis, h.chr_name, h.chr_ort,
  NULL Name, NULL Vorname, NULL Preis
FROM acc_seminar.t_Seminar
JOIN dbo.tbl_hotel h ON Sem_Ht_ID=h.pk_hotel
WHERE Sem_ID IN (SELECT value  
FROM fn_Split(@Sem_ID, ';')  
WHERE RTRIM(value) <> '') AND (Sem_SemTh_ID != 76 AND Sem_Sto = 0)

UNION ALL

SELECT
  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,
  tu.TU_Name AS Name, tu.TU_Vorname AS Vorname, ParkgebuehrBrutto AS Preis
FROM acc_seminar.t_Teiluber_Ext tux
JOIN acc_seminar.t_Teiluber tu ON tux.TeiluberId = tu.TU_ID
JOIN acc_seminar.t_Seminar s ON tu.TU_Sem_ID = s.Sem_ID WHERE s.Sem_ID IN (SELECT value  
FROM fn_Split(@Sem_ID, ';')  
WHERE RTRIM(value) <> '')  AND ParkgebuehrBrutto IS NOT NULL
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...