【问题标题】:Filtering Results of a CTE to eventually end up in a SQL report过滤 CTE 的结果以最终在 SQL 报告中结束
【发布时间】:2021-02-02 17:52:55
【问题描述】:

我正在使用 SSMS、SQL Server 和 SSRS。我有一个 CTE 的结果,我想在它运行“之后”进一步过滤它。

查询在表中查找多个 ID 条目。然后它选择具有空值的那些。这是一个正确的选择,我需要进一步缩小范围。

此时,我过去会将其输出转储到 excel 文件中,并在 ID 字段中查找并突出显示重复值,并且只显示这些行。我的目标是将此纳入 SSRS 报告。

我是否只需要创建一个视图然后针对它运行另一个 CTE 视图、某种类型的嵌套查询,或者存储一个过程并过滤掉结果或使用用户定义的函数?我可以在第一个 CTE 之后使用逗号之类的东西,或者做另一个 WITH 语句吗?提前致谢。

WITH T AS
(
SELECT [ID] ,
    [LOCATION] ,
    [LOCATION_START_DATE],
    [LOCATION_END_DATE],
    [POS],
    COUNT(*) OVER (PARTITION BY [ID]) as Cnt
FROM LOCATIONS_TABLE WITH (NOLOCK)
)
SELECT  [ID] ,
    [LOCATION] ,
    [LOCATION_START_DATE],
    [LOCATION_END_DATE],
    [POS]
FROM T
WHERE Cnt >= 2
AND LOCATION_END_DATE IS NULL
ORDER BY ID

【问题讨论】:

  • 有了样本数据和预期结果,您的问题会变得更加清晰。

标签: sql sql-server tsql subquery common-table-expression


【解决方案1】:

您可以按如下方式级联多个 CTE:

WITH 
    T AS (
        SELECT [ID] ,
            [LOCATION] ,
            [LOCATION_START_DATE],
            [LOCATION_END_DATE],
            [POS],
            COUNT(*) OVER (PARTITION BY [ID]) as Cnt
        FROM LOCATIONS_TABLE WITH (NOLOCK)
    ),
    U AS (
        SELECT  [ID] ,
            [LOCATION] ,
            [LOCATION_START_DATE],
            [LOCATION_END_DATE],
            [POS]
        FROM T
        WHERE Cnt >= 2
        AND LOCATION_END_DATE IS NULL
    )
SELECT ...

【讨论】:

  • 您甚至可以加入到以前级联的 cte(如果出于某种原因需要)
  • 谢谢。在我纠正了一些语法之后,这完美地解决了。欣赏它。
【解决方案2】:

您可以创建一个本地 #temporary_table,将 CTE 结果插入到此 #temporary_table 中,然后将结果过滤为选择,根据需要将其保存到文件中。

这种方法的优点是 #temporary_tables 比嵌套查询和普通表快得多。另一个优点是您可以创建其他查询,在 #temporary_table 中创建其他过滤器,这些过滤器没有嵌套 CTE 复杂,并且允许您在需要新过滤器时生成其他报告而无需修改 CTE。

您可以像创建普通表一样创建本地临时表。

CREATE TABLE #temporary_table_name(
-- fields that match the results of the CTE
);

您可以像在普通表中一样向临时表中插入记录。

INSERT INTO #temporary_table_name.

缺点是每次创建临时表的用户结束连接时,临时表都会连同存储的数据一起被删除。

希望对你有帮助!

【讨论】:

  • 感谢您的建议。我会将临时表保存在 may 工具包中以备后用。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多