【问题标题】:joining two tables using CTE使用 CTE 连接两个表
【发布时间】:2017-03-28 23:45:12
【问题描述】:

我有两个查询返回以下输出:T1 和 T2

现在我想在 T1.CMonth 和 T2.DueMonth 字段中加入这两个表。

最终输出应如 png 所示。

T1 的查询:

SELECT WorkManagementAsset.AssetCategory, CONVERT(CHAR(4), WorkItem.CompleteDate, 100) + CONVERT(CHAR(4), WorkItem.CompleteDate, 120) AS CMonth, COUNT(CONVERT(CHAR(4), WorkItem.CompleteDate, 100) + CONVERT(CHAR(4), WorkItem.CompleteDate, 120)) 作为 Total_Complete FROM WorkManagementAsset INNER JOIN WorkOrder ON WorkManagementAsset.Oid = WorkOrder.Asset INNER JOIN WorkItem ON WorkOrder.Oid = WorkItem.WorkOrder INNER JOIN InspectionDefectItem ON WorkItem.DefectItem = InspectionDefectItem.Oid AND WorkItem.Oid = InspectionDefectItem.WorkItem WHERE(不是(InspectionDefectItem.DefectGroupName LIKE N'Re%')) 按 WorkManagementAsset.AssetCategory 分组,CONVERT(CHAR(4),WorkItem.CompleteDate,100) + CONVERT(CHAR(4),WorkItem.CompleteDate,120) HAVING (WorkManagementAsset.AssetCategory = N'sealedroads') AND (NOT (CONVERT(CHAR(4), WorkItem.CompleteDate, 100) + CONVERT(CHAR(4), WorkItem.CompleteDate, 120) IS NULL))

T2 的查询:

选择 WorkManagementAsset.AssetCategory, CONVERT(CHAR(4), WorkItem.DueDate, 100) + CONVERT(CHAR(4), WorkItem.DueDate, 120) AS 到期月, COUNT(CONVERT(CHAR(4), WorkItem.DueDate, 100) + CONVERT(CHAR(4), WorkItem.DueDate, 120)) AS Total_DUE FROM WorkManagementAsset INNER JOIN WorkOrder ON WorkManagementAsset.Oid = WorkOrder.Asset INNER JOIN WorkItem ON WorkOrder.Oid = WorkItem.WorkOrder INNER JOIN InspectionDefectItem ON WorkItem.DefectItem = InspectionDefectItem.Oid AND WorkItem.Oid = InspectionDefectItem.WorkItem WHERE (NOT (InspectionDefectItem.DefectGroupName LIKE N'Re%')) GROUP BY WorkManagementAsset.AssetCategory, CONVERT(CHAR(4), WorkItem.DueDate, 100) + CONVERT(CHAR(4), WorkItem.DueDate, 120) HAVING
(WorkManagementAsset.AssetCategory = N'sealedroads')和 (CONVERT(CHAR(4), WorkItem.DueDate, 100) + CONVERT(CHAR(4), WorkItem.DueDate, 120) '0')

任何帮助将不胜感激。 谢谢

Tables and Output

【问题讨论】:

    标签: tsql join reporting-services common-table-expression


    【解决方案1】:

    这个

    WITH T1 AS
    (
      SELECT 
        WorkManagementAsset.AssetCategory, 
        CONVERT(CHAR(4), WorkItem.CompleteDate, 100) + CONVERT(CHAR(4), WorkItem.CompleteDate, 120) AS CMonth, 
        COUNT(CONVERT(CHAR(4), WorkItem.CompleteDate, 100) + CONVERT(CHAR(4), WorkItem.CompleteDate, 120)) AS Total_Complete
      FROM WorkManagementAsset 
      INNER JOIN WorkOrder 
        ON WorkManagementAsset.Oid = WorkOrder.Asset 
      INNER JOIN WorkItem 
        ON WorkOrder.Oid = WorkItem.WorkOrder 
      INNER JOIN InspectionDefectItem 
        ON WorkItem.DefectItem = InspectionDefectItem.Oid AND WorkItem.Oid = InspectionDefectItem.WorkItem 
      WHERE (NOT (InspectionDefectItem.DefectGroupName LIKE N'Re%')) 
      GROUP BY 
        WorkManagementAsset.AssetCategory, 
        CONVERT(CHAR(4), WorkItem.CompleteDate, 100) + CONVERT(CHAR(4), WorkItem.CompleteDate, 120) 
      HAVING (WorkManagementAsset.AssetCategory = N'sealedroads') 
      AND (NOT (CONVERT(CHAR(4), WorkItem.CompleteDate, 100) + CONVERT(CHAR(4), WorkItem.CompleteDate, 120) IS NULL))
    ),
    T2 AS
    (
      SELECT 
        WorkManagementAsset.AssetCategory, 
        CONVERT(CHAR(4), WorkItem.DueDate, 100) + CONVERT(CHAR(4), WorkItem.DueDate, 120) AS DueMonth, 
        COUNT(CONVERT(CHAR(4), WorkItem.DueDate, 100) + CONVERT(CHAR(4), WorkItem.DueDate, 120)) AS Total_DUE 
      FROM WorkManagementAsset 
      INNER JOIN WorkOrder 
        ON WorkManagementAsset.Oid = WorkOrder.Asset 
      INNER JOIN WorkItem 
        ON WorkOrder.Oid = WorkItem.WorkOrder 
      INNER JOIN InspectionDefectItem 
        ON WorkItem.DefectItem = InspectionDefectItem.Oid 
        AND WorkItem.Oid = InspectionDefectItem.WorkItem 
      WHERE (NOT (InspectionDefectItem.DefectGroupName LIKE N'Re%')) 
      GROUP BY WorkManagementAsset.AssetCategory, 
      CONVERT(CHAR(4), WorkItem.DueDate, 100) + CONVERT(CHAR(4), WorkItem.DueDate, 120) 
      HAVING (WorkManagementAsset.AssetCategory = N'sealedroads') 
      AND (CONVERT(CHAR(4), WorkItem.DueDate, 100) + CONVERT(CHAR(4), WorkItem.DueDate, 120) <> '0')
    )
    SELECT *
    FROM T1 
    INNER JOIN T2 ON T1.CMonth = T2.DueMonth;
    

    请注意,由于多种原因,这是一个非常低效的查询。

    【讨论】:

    • 感谢您的快速回复,查询生成了所需的输出。您能否指出效率低下的原因,以便我可以提高我的知识和查询
    • @FazalT 像AND (NOT (CONVERT(CHAR(4), WorkItem.CompleteDate, 100) + CONVERT(CHAR(4), WorkItem.CompleteDate, 120) IS NULL)) 这样的好奇心无济于事。那不是有点类似于and WorkItem.CompleteDate is not NULL吗?
    猜你喜欢
    • 2016-12-21
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 2012-08-18
    • 1970-01-01
    • 2018-07-12
    • 2018-12-04
    相关资源
    最近更新 更多