Tsql 使用CTE连接两个表

Tsql 使用CTE连接两个表,tsql,join,reporting-services,common-table-expression,Tsql,Join,Reporting Services,Common Table Expression,我有两个查询返回以下输出:T1和T2 现在,我想连接T1.CMonth和T2.DueMonth字段上的两个表 最终输出应如png中所示 T1的查询: 选择WorkManagementAsset.AssetCategory、CONVERTCHAR4、WorkItem.CompleteDate、100+CONVERTCHAR4、WorkItem.CompleteDate、120作为cm月, COUNTCONVERTCHAR4,WorkItem.CompleteDate,100+CONVERTCHAR

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

现在,我想连接T1.CMonth和T2.DueMonth字段上的两个表

最终输出应如png中所示

T1的查询:

选择WorkManagementAsset.AssetCategory、CONVERTCHAR4、WorkItem.CompleteDate、100+CONVERTCHAR4、WorkItem.CompleteDate、120作为cm月, COUNTCONVERTCHAR4,WorkItem.CompleteDate,100+CONVERTCHAR4,WorkItem.CompleteDate,总计120 从WorkManagementAsset内部联接 WorkManagementAsset.Oid上的WorkOrder=WorkOrder.Asset内部联接 WorkOrder.Oid上的WorkItem=WorkItem.WorkOrder内部联接 WorkItem.DefectItem上的InspectionDefectItem=InspectionDefectItem.Oid和WorkItem.Oid=InspectionDefectItem.WorkItem 其中不包括InspectionDefectItem.DefectGroupName,如N'Re%' 按WorkManagementAsset.AssetCategory分组,CONVERTCHAR4,WorkItem.CompleteDate,100+CONVERTCHAR4,WorkItem.CompleteDate,120 具有WorkManagementAsset.AssetCategory=N'SealedLoads'且不具有CONVERTCHAR4、WorkItem.CompleteDate、100+CONVERTCHAR4, WorkItem.CompleteDate,120为空

T2的查询:

选择WorkManagementAsset.AssetCategory,CONVERTCHAR4, WorkItem.DueDate,100+CONVERTCHAR4,WorkItem.DueDate,120 AS 上个月, COUNTCONVERTCHAR4,WorkItem.DueDate,100+CONVERTCHAR4,WorkItem.DueDate,120作为WorkManagementAsset内部联接到期的总金额 WorkManagementAsset.Oid上的WorkOrder=WorkOrder.Asset内部联接 WorkOrder.Oid上的WorkItem=WorkItem.WorkOrder内部联接 WorkItem.DefectItem上的InspectionDefectItem=InspectionDefectItem.Oid和WorkItem.Oid= InspectionDefectItem.WorkItem,其中不包括 InspectionDefectItem.DefectGroupName类似于N'Re%'分组依据 WorkManagementAsset.AssetCategory,CONVERTCHAR4,WorkItem.DueDate, 100+CONVERTCHAR4,WorkItem.DueDate,120具有 WorkManagementAsset.AssetCategory=N'sealedroads'和 CONVERTCHAR4,WorkItem.DueDate,100+CONVERTCHAR4, WorkItem.DueDate,120“0”

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

这个


请注意,这是一个效率极低的查询,原因有很多

感谢您的快速回复,查询生成了所需的输出。您能否指出效率低下的原因,以便我可以提高我的知识和查询效率well@FazalT像AND NOT CONVERTCHAR4、WorkItem.CompleteDate、100+CONVERTCHAR4、WorkItem.CompleteDate、120为NULL这样的奇怪信息也没有帮助。这与WorkItem.CompleteDate不为NULL有点类似吗?
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;