Уникальное перекрестное соединение в таблице SQL - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь объединить две «таблицы» в SQL, чтобы использовать разные столбцы для представления различных частей линейной диаграммы в построителе отчетов SSRS, включая затененный диапазон, срединную линию и построенную линию результатов, чтобывыглядит как на рисунке ниже.

Expected outcome

У меня есть одна таблица с данными для отображения затененного диапазона на графике и срединной линии в зависимости от возраста.

ПримерТаблица 1,

+---------+-----------------+------------+------------+
| Age     | LowerRange      | UpperRange | Median     |
+---------+-----------------+------------+------------+
| 6       | 100             | 120        | 1          |
| 8       | 200             | 400        | 4          |
| 10      | 300             | 700        | 7          |
| 12      | 400             | 1100       | 1          |
| 14      | 500             | 4000       | 4          |
| 16      | 600             | 7000       | 7          |
| 18      | 700             | 11000      | 1          |
| 20      | 800             | 40000      | 4          |
| 22      | 900             | 70000      | 7          |
+---------+-----------------+------------+------------+

Затем у меня есть запрос, который объединяет несколько таблиц в одну таблицу, которая дает результаты для построения графика на этом графике в виде пунктирной линии.

Пример таблицы 2,

+---------+-------+
| Age     | Value |
+---------+-------+
| 8       | 150   |
| 9       | 270   |
| 14      | 530   |
| 22      | 980   |
+---------+-------+

Я не могу использовать два набора данных на одном отдельном графике, поэтому я решил соединить две таблицы, но это дает мне такую ​​таблицу;Таблица 3

+---------+-----------------+------------+------------+---------+-------+
| Age     | LowerRange      | UpperRange | Median     | Res.Age | Value |
+---------+-----------------+------------+------------+---------+-------+
| 6       | 100             | 120        | 1          | 8       | 150   |
| 6       | 100             | 120        | 1          | 9       | 270   |
| 6       | 100             | 120        | 1          | 14      | 530   |
| 6       | 100             | 120        | 1          | 22      | 980   |
| 8       | 200             | 400        | 4          | 8       | 150   |
| 8       | 200             | 400        | 4          | 9       | 270   |
| 8       | 200             | 400        | 4          | 14      | 530   |
| 8       | 200             | 400        | 4          | 22      | 980   |
| 10      | 300             | 700        | 7          | 8       | 150   |
| 10      | 300             | 700        | 7          | 9       | 270   |
| 10      | 300             | 700        | 7          | 14      | 530   |
| 10      | 300             | 700        | 7          | 22      | 980   |
| 12      | 400             | 1100       | 1          | 8       | 150   |
| 12      | 400             | 1100       | 1          | 9       | 270   |
| 12      | 400             | 1100       | 1          | 14      | 530   |
| 12      | 400             | 1100       | 1          | 22      | 980   |
| 14      | 500             | 4000       | 4          | 8       | 150   |
| 14      | 500             | 4000       | 4          | 9       | 270   |
| 14      | 500             | 4000       | 4          | 14      | 530   |
| 14      | 500             | 4000       | 4          | 22      | 980   |

Как объединить таблицы 1 и 2 для создания одной таблицы с нулевыми дубликатами, как в таблице 4 ниже?

Пример ожидаемого результата, Таблица 4

+---------+-----------------+------------+------------+---------+-------+
| Age     | LowerRange      | UpperRange | Median     | Res.Age | Value |
+---------+-----------------+------------+------------+---------+-------+
| 6       | 100             | 120        | 1          | 8       | 150   |
| 8       | 200             | 400        | 4          | 9       | 270   |
| 10      | 300             | 700        | 7          | 14      | 530   |
| 12      | 400             | 1100       | 1          | 22      | 980   |
| 14      | 500             | 4000       | 4          | -       | -     |
| 16      | 600             | 7000       | 7          | -       | -     |
| 18      | 700             | 11000      | 1          | -       | -     |
| 20      | 800             | 40000      | 4          | -       | -     |
| 22      | 900             | 70000      | 7          | -       | -     |
+---------+-----------------+------------+------------+---------+-------+

Ответы [ 2 ]

0 голосов
/ 04 марта 2019

Я не думаю, что вы можете сделать это в SSRS напрямую, поскольку у вас нет возможности присоединиться к таблицам, поскольку они не имеют уникального ключа.

На мой взгляд, у вас естьдва варианта.Добавьте ключ к каждой таблице, а затем используйте поиск в SSRS. Примечание: вы не можете использовать RowNumber () в вычисляемом столбце или в функции LOOKUP в SSRS, поэтому ключи необходимо указывать непосредственно в запросе к набору данных.

Второй и, вероятно, второйболее простой вариант, это сделать это на стороне сервера и использовать один набор данных.Я не MySQL человек, но я думаю, что следующее должно работать нормально на MySQL 8.0 или выше.

CREATE TABLE Table1(Age int, LowerRange int, UpperRange int, Median int);
INSERT INTO Table1(Age, LowerRange, UpperRange, Median) VALUES
(6,100, 120, 1),
(8,200, 400, 4),
(10,300, 700, 7),
(12,400, 1100, 1),
(14,500, 4000, 4),
(16,600, 7000, 7),
(18,700, 11000, 1),
(20,800, 40000, 4),
(22,900, 70000, 7);

CREATE TABLE Table2(Age int, Value int);
INSERT INTO Table2(Age, Value) VALUES
(8, 150),
(9, 270),
(14, 530),
(22, 980);

SELECT 
        * 
    FROM 
        (SELECT *, ROW_NUMBER() OVER(ORDER BY Age) rn FROM Table1) x
        LEFT JOIN 
        (SELECT *, ROW_NUMBER() OVER(ORDER BY Age) rn FROM Table2) y
            ON x.rn = y.rn

Это вернет точные результаты, которые вы показали в вашем примере (плюс номера строк, которые вы, очевидно, можетеисключите, если хотите)

Вот скрипка для вышеприведенного примера.

https://www.db -fiddle.com / f / bMVF9Co46dhAip5GHuofAw / 0

0 голосов
/ 04 марта 2019

Чтобы объединить два набора данных в SSRS, вы можете использовать Lookup() на обоих внешних ключах.Поместите таблицу в свой отчет, затем свяжите таблицу с Dataset1.Поместите все поля из Dataset1 в ваш tablix.Чтобы отобразить поля из Dataset2, используйте следующее выражение в таблице:

=Lookup(Fields!Dataset1ID.Value, Fields!Dataset2ID.Value, Fields!Dataset2DisplayedField.Value, "Dataset2")

Это выражение будет искать совпадение ID´s, а затем отобразит третий аргумент.Вы можете делать это чаще, чтобы отображать различные поля от Dataset2.

...