【问题标题】:SSRS Joining Records With Different Values in Same ColumnSSRS 在同一列中连接具有不同值的记录
【发布时间】:2019-05-15 23:12:46
【问题描述】:

所以我不太确定如何措辞,而且我对在专业环境中使用 SQL 还很陌生,但我希望我能清楚地理解。首先,我的数据如下所示:

+--------+-----------+-------------+------------------+ 
| LandID | LandUnits | LandLineNum | TaxableLandValue |
+--------+-----------+-------------+------------------+ 
| 36512  | 19        | 6           | 8129             | 
| 36513  | 25        | 4           | 20638            | 
| 36514  | 5         | 3           | 18484            |
| 36515  | 95        | 5           | 78530            | 
| 36516  | 73        | 2           | 260560           | 
| 36517  | 1         | 1           | 20528            | 
| 36518  | 25        | 104         | 6500             | 
| 36519  | 73        | 102         | 57541            | 
| 36520  | 1         | 101         | 20528            | 
| 36521  | 19        | 106         | 1281             | 
| 36522  | 95        | 105         | 19977            | 
| 36523  | 5         | 103         | 3068             |
+--------+-----------+-------------+------------------+

这些LandID 部分都由另一个表中的单个PropertyID 关联——通过桥表(PropertyToLand) 引用。所以基本上,这 12 条记录与同一业主有关,构成一个人拥有的 6 块土地。如果您仔细查看此数据,您会发现 LineNum 1-6 与它们各自的 LandUnit 对齐并依赖于 LineNum 101-106,但这些记录之间的 TaxableLandValue 是不同的。

不要问我为什么要以这种方式构建表,但基本上,SSRS 报告中的一个字段需要TaxableLandValues 来自LineNum 1-6,而TaxableLandValues 来自LineNum 101-106为另一个字段而不修改表。

目前,我的存储过程中的SELECT TaxableLandValue 成功获取了 1-6 的值,而我一直在根据 101-106 记录中的另一列 ZoningID(即 NULL)过滤掉其他结果,否则将所有 12 条记录添加到报告中。

基本上,我需要找出将LineNum 1 与LineNum 101 等连接起来的最佳方式,以隔离不同的TaxableLandValue 结果。

我当前的 SQL 过程创建了一个包含 15 列的表,我将尝试压缩我的代码以显示问题。

ALTER PROCEDURE rpt_LandData
   @PropertyID INT

CREATE TABLE #temp (
LandID VARCHAR(50), 
LandUnits INT, 
LandLineNum INT, 
TaxableLandValue VARCHAR(50),
TaxableUseValue VARCHAR(50))

INSERT INTO #temp(
l.LandID AS LandId, 
l.LandUnits AS LandUnits, 
l.LandLineNum AS LandLineNum, 
l.TaxableLandValue AS TaxableLandValue,
l.TaxableLandValue AS TaxableUseValue)

FROM t_Land l
INNER JOIN t_PropertyToLand ptl ON l.LandID=ptl.LandID
INNER JOIN t_Property p ON ptl.PropertyID=p.PropertyID

WHERE ptl.PropertyID = @PropertyID AND l.ZoningID IS NOT NULL

SELECT * FROM #temp 
ORDER BY CASE WHEN LandLineNum IS NULL THEN 1 ELSE 0 END, LandLineNum ASC

我尝试了各种方法,包括删除ZoningID 上的过滤器,而是使用(SELECT TaxableLandValue FROM t_Land WHERE ZoningID IS NULL) AS TaxableUseValue,但这是我难以理解的方法。

我的预期结果是这样的:

+--------+-----------+-------------+------------------+-----------------+
| LandID | LandUnits | LandLineNum | TaxableLandValue | TaxableUseValue |
+--------+-----------+-------------+------------------+-----------------+
| 36517  | 1         | 1           | 20528            | 20528           |
| 36516  | 73        | 2           | 260560           | 57541           |
| 36514  | 5         | 3           | 18484            | 3068            |
| 36513  | 25        | 4           | 20638            | 6500            |
| 36515  | 95        | 5           | 78530            | 19977           |
| 36512  | 19        | 6           | 8129             | 1281            |
+--------+-----------+-------------+------------------+-----------------+

提前感谢您的帮助,如果您需要更多信息,请告诉我。 抱歉,如果这是重复的,但我无法找到任何相关问题。

【问题讨论】:

  • 加入LandLineNum = LandLineNum+100?有什么原因不那么简单吗?
  • @TabAlleman 您介意提供一个示例,说明在我的程序上下文中会是什么样子吗?你是在建议一个额外的 JOIN 声明将 Land 加入到自身中?

标签: sql sql-server reporting-services sql-server-2012


【解决方案1】:

我非常感谢@TabAlleman 的帮助,感谢他的意见,我能够解决我的问题,尽管给出的答案并不是我正在寻找的解决方案。我能够通过在 LandLineNum - 100 上将 t_Land 加入到自身来找到正确的答案,但还必须验证被调用的参数是否与正在加入的 t_Property 表匹配。

SELECT  l.LandID AS LandID,
    l.LandLineNum AS LineNum, 
    l.LandValueTaxable AS TaxValues,
    la.LandLineNumber AS LineNum2,
    la.LandValueTaxable AS UseValues
     FROM t_Land l 
LEFT JOIN t_Land la ON l.LandLineNum = la.LandLineNum - 100
LEFT JOIN t_PropertyToLand prl ON l.LandID = prl.LandID
LEFT JOIN t_Property pr ON prl.PropertyID = pr.PropertyID
LEFT JOIN t_PropertyToLand prl2 ON la.LandID = prl2.LandID
LEFT JOIN t_Property pr2 ON prl2.Property_ID = pr2.Property_ID

WHERE pr.PropertyID = @PropertyID AND pr2.PropertyID = @PropertyID

【讨论】:

    【解决方案2】:

    作为我评论中建议的示例,您可以在 FROM 子句中执行以下操作:

    (根据评论编辑)

    ...
    FROM  t_Land l 
    INNER JOIN t_Land u ON l.LandID=u.LandID AND l.LandLineNum = u.LandLineNum - 100
    {This may require TWO joins to t_PropertyToLand, I can't say since you haven't shared your full table structure}
    ...
    

    然后l.TaxableLandValue 将具有您的土地价值,u.TaxableLandValue 将具有您的使用价值。

    您必须包含一些过滤器,以防止超过 100 的 linenums 被计入 l 结果中。

    【讨论】:

    • 这可能不会像LandLineNum 那样工作,它是Land 表中的一个字段,而不是PropertyToLand,它只将Land 记录与@987654331 中的相应所有者联系起来@。当我尝试调整此解决方案时,INNER JOIN 似乎会产生所有 NULL 值。使用 LEFT JOIN t_Land l ON ptl.Land_ID = l.Land_ID LEFT JOIN t_Land la ON l.Land_ID = la.Land_ID AND la.LandLineNum = l.LandLineNum - 100 仅在 TaxableUseValue 列中产生 NULL 值。
    • 是的,我不得不猜测您的表结构,因为它没有完全共享。我已根据您的评论编辑了答案。
    • 我想我遇到的问题是我自己的错,但我的意图是更简洁。目前,LandLEFT JOINed 与 8 个其他表格一起填写报告所需的 15 个字段,INNER JOIN 似乎杀死了我的其他联接并导致所有字段返回NULLLand 包含大约 30 列,Property 包含 75 列,而 PropertyToLand 只有 6 个,是一个 PK、PropertyIDLandID 和 3 个时间戳。如果有帮助,我对此处显示的报告有另一个悬而未决的问题stackoverflow.com/questions/53744617/ssrs-selective-page-break
    猜你喜欢
    • 2021-03-14
    • 1970-01-01
    • 2021-02-10
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多