【问题标题】:Unique Cross Join in SQL TableSQL 表中的唯一交叉联接
【发布时间】:2019-03-04 05:21:21
【问题描述】:

我正在尝试在 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          | -       | -     |
+---------+-----------------+------------+------------+---------+-------+

【问题讨论】:

  • 我无法按照您的要求进行操作。
  • 我该怎么做才能更清楚?我试图尽我所能解释,但我想这是一个奇怪的问题。
  • 显示清楚标记的输入和输出,然后仅描述从A点到B点的逻辑。您在上面给出了四个表,一些原始的,一些结果集或中间体,我不清楚你在做什么。
  • 我想合并两个原始表,使用 SSRS Report Builder 数据集查询生成一个没有重复的表。
  • 哪些规则决定哪些“重复”应该被丢弃?

标签: mysql sql reporting-services reportbuilder cross-join


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您的帮助。事实证明,我必须创建一个 UNION ALL 才能将所有数据合并到一个表中。
【解决方案2】:

我认为您不能直接在 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

【讨论】:

  • 感谢您的帮助。事实证明,我必须创建一个 UNION ALL 才能将所有数据合并到一个表中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-13
  • 1970-01-01
  • 2020-09-07
  • 2013-10-10
相关资源
最近更新 更多