【问题标题】:Select Rows based on Entire Subset matching a condition,根据匹配条件的整个子集选择行,
【发布时间】:2015-12-18 09:57:44
【问题描述】:

我想根据上传到系统的源信息显示一系列可供下载的报告。每份报告可能存在多个报告期,并且可能需要上传一个或多个源文件才能使用。

我的表格如下所示:

  • 报告 - 存储报告类型 (ReportID) 和说明
  • ReportDependency - 存储报告类型 (ReportID) 和 生成该报告的依赖项(可能是一个或多个)(SourceTypeID)
  • SourceType - 存储可能上传到系统的不同类型的源文件。
  • Source - 存储已上传的源数据文件(SourceTypeID、ReportingPeriodID 和 UploadDateTime)
  • 报告期 - 存储各种报告期。

根据可用的资源(上传到系统),我想展示可以生成/下载哪些报告。

我想出了这个,但它不正确:

SELECT
RD.ReportID, RP.ReportingPeriodID, COUNT(S.UploadDateTime) AS    
     DependenciesUploaded
FROM
ReportDependency RD
    INNER JOIN
Source S ON RD.SourceTypeID = S.SourceTypeID
    INNER JOIN
ReportingPeriod RP ON S.ReportingPeriodID = RP.ReportingPeriodID
GROUP BY
     RP.ReportingPeriodID, RD.ReportID
HAVING
    COUNT(S.UploadDateTime) = (SELECT COUNT(SourceTypeID) FROM ReportDependency WHERE ReportID = RD.ReportID)

如果我的数据如下所示:

我应该得到:

  • ReportingPeriod 1 的报告 1 可用
  • 报告 2 尚不可用
  • ReportingPeriod 2 的报告 3 可用

感谢您提供的任何帮助。

罗素

【问题讨论】:

  • "I have come up with this, but it's not correct:" 你收到错误,还是没有返回你期望的数据?
  • 不是我期待的结果。 :-)

标签: sql subquery conditional-statements aggregate subset


【解决方案1】:

当您进行第一次内部连接时,应该是

ReportDependency RD
  INNER JOIN
Source S ON RD.SourceTypeID = S.SourceTypeID

而不是

Source S ON RD.SourceTypeID = S.SourceID

这样您就不会将IDTYPEID 进行比较。

【讨论】:

  • 那根本没有解决问题,只是更正了一个错字。 :-)
【解决方案2】:

我一直在努力解决这个问题......如果它对某人有帮助,这里有一个似乎有效的解决方案(尚未完成测试)。 (我可能调整了一两个表,我不记得了;希望这足以帮助其他人。)

罗素

            SELECT
                *
            FROM
                (
                    SELECT DISTINCT
                        R.ReportID,
                        R.FilePathAndName,
                        RP.ReportingPeriodID,
                        COUNT(RD.SourceTypeID) OVER (PARTITION BY R.ReportID, R.FilePathAndName, RP.ReportingPeriodID) AS SourcesNeeded
                    FROM
                        luReportingPeriod RP
                            CROSS JOIN
                        Report R
                            INNER JOIN
                        ReportDependency RD ON R.ReportTypeID = RD.ReportTypeID
                            INNER JOIN
                        (
                        SELECT 
                        S.ReportingPeriodID,
                        S.SourceTypeID
                            FROM
                        luReportingPeriod RP
                            INNER JOIN
                        Source S ON (RP.ReportingPeriodID = S.ReportingPeriodID)
                            GROUP BY
                                S.ReportingPeriodID,
                                S.SourceTypeID
                        ) AS AvailableSources ON RP.ReportingPeriodID = AvailableSources.ReportingPeriodID AND RD.SourceTypeID = AvailableSources.SourceTypeID
                    GROUP BY
                        R.ReportID,
                        R.FilePathAndName,
                        RP.ReportingPeriodID,
                        RD.SourceTypeID
                ) AS Data
                INNER JOIN
                (
                    SELECT ReportTypeID, COUNT(SourceTypeID) AS SourcesNeeded
                    FROM
                        ReportDependency
                    GROUP BY ReportTypeID
                ) AS RequirementCount
                ON RequirementCount.ReportTypeID = Data.ReportID AND RequirementCount.SourcesNeeded = Data.SourcesNeeded
                INNER JOIN
                    luReportingPeriod ON Data.ReportingPeriodID = luReportingPeriod.ReportingPeriodID
                ORDER BY luReportingPeriod.Year DESC, luReportingPeriod.Month DESC, Data.FilePathAndName

【讨论】:

    猜你喜欢
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-04
    • 1970-01-01
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多