SQL表中的唯一交叉联接

时间:2019-03-04 05:21:22

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

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

Expected outcome

我有一张桌子,上面有数据,可在图表上显示阴影范围,并根据年龄显示中线。

示例表1,

public boolean checkPurchaseMethod(String skuID) throws RepositoryException{

    String consignmenttypeName = "";

    RepositoryItem skuRepItem=getProductRepository().getItem(skuID.trim(), "sku");
    if (skuRepItem != null) {

     RepositoryItem consignmentType = (RepositoryItem) skuRepItem.getPropertyValue("consignmentType");
        if(consignmentType!=null){

            consignmenttypeName = (String)consignmentType.getPropertyValue("id");

            if(consignmenttypeName !="instock" && consignmenttypeName != "consignment"){
                return true;
            }
        }   
    }
    return false;
}

然后我有一个查询,该查询将几个表连接到一个表中,该表产生的结果以虚线图的形式绘制在该图上。

示例表2,

+---------+-----------------+------------+------------+
| 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          |
+---------+-----------------+------------+------------+

我不能在一个图表上使用两个数据集,所以我决定将两个表交叉连接,但是它为我提供了一个这样的表; 表3

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

我如何结合表1和2来生成一个零重复的表,如下面的表4?

预期输出的示例, 表4

+---------+-----------------+------------+------------+---------+-------+
| 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   |

2 个答案:

答案 0 :(得分:0)

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

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

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

答案 1 :(得分: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