SQL表中的唯一交叉连接

问题描述 投票:0回答:2

我正在尝试在SQL中连接两个“表”,以便使用不同的列来表示SSRS报表生成器中折线图的不同部分,包括阴影范围,中间线和绘制的结果线,因此它看起来像下面的图像。

我有一个数据表,在图表上显示阴影范围,基于年龄显示中值线。

示例表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          | -       | -     |
+---------+-----------------+------------+------------+---------+-------+
mysql sql reporting-services reportbuilder cross-join
2个回答
0
投票

要在SSRS中连接两个数据集,可以在两个外键上使用Lookup()。在报表中添加一个Tablix,然后将Tablix链接到Dataset1。将Dataset1中的所有字段放在Tablix中。要显示Dataset2中的字段,请使用Tablix中的以下表达式:

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

此表达式将查找匹配的ID´s,然后显示第三个参数。您可以更频繁地执行此操作以显示Dataset2中的不同字段。


0
投票

我不认为您可以直接在SSRS中执行此操作,因为您无法加入表,因为它们没有唯一键。

在我看来,你有两个选择。为每个表添加一个密钥,然后在SSRS中使用查找。注意:您不能在计算列中或在SSRS中的LOOKUP函数内使用RowNumber(),因此必须直接在数据集查询中提供键。

第二个,也许更简单的选择,它在服务器端执行此操作并使用单个数据集。我不是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

© www.soinside.com 2019 - 2024. All rights reserved.