【问题标题】:Combine 2 tables into 1 query将 2 个表合并为 1 个查询
【发布时间】:2021-04-13 12:04:39
【问题描述】:

我在使用 WITH 语句和 JOIN 将 2 个查询组合成 1 个查询时遇到问题。 我已经尝试过了,但没有一个能按照我想要的方式输出。

期望的输出

?

单独的输出

加入结果

【问题讨论】:

  • 我强烈建议你学会正确地格式化你的写作。在任何书面语言中,很好地使用空格和换行符非常 很重要,并且包含 代码。所有左对齐的代码都非常难以阅读。
  • 良好的别名也真的很重要。 a 是为了TX_DETAILSb 是为了TX_URK
  • 最后,varchar 有一个长度属性;不定义它是一个非常糟糕的习惯,会导致意外和不受欢迎的行为。
  • 我很抱歉..在我的浏览器中它看起来不错并且并非全部左对齐,是的 A 用于 TX_DETAILS,B 用于 TX_URK
  • "在我的浏览器中它看起来不错,并且并非全部左对齐," 因为我为您编辑了代码并对其进行了格式化。不是initially

标签: sql-server ssms-18


【解决方案1】:
WITH your_first_query AS (
  SELECT ...
)
, your_second_query AS (
  SELECT ...
)
SELECT your_first_query.OFFICE
     , your_first_query.MONTH
     , your_first_query.NOMINAL_A
     , your_second_query.NOMINAL_B
FROM   your_first_query
 INNER
  JOIN your_second_query
    ON your_second_query.OFFICE = your_first_query.OFFICE
   AND your_second_query.MONTH = your_first_query.MONTH
ORDER
    BY your_first_query.OFFICE
     , your_first_query.MONTH
;

【讨论】:

  • 谢谢,但在尝试后我收到错误“将 varchar 值 'Pem' 转换为数据类型 int 时,消息 245,级别 16,状态 1,第 81 行转换失败。”我检查了数据,所有数据都是匹配的,没有类型 int 数据..为什么我得到那个错误?
  • 我尝试删除“ON your_second_query.OFFICE = your_first_query.OFFICE”,它工作正常,没有出错,但输出与我之前尝试的相同
  • 在两个查询中检查OFFICE的数据类型。
  • 我在您的代码中使用了 FULL OUTER JOIN,它按照我想要的方式工作,非常感谢先生!
【解决方案2】:

希望以下方法可以解决您的问题:

WITH NOMINAL_A_CTE (OFFICE, MONTH, NOMINAL_A)
AS
(
SELECT OFFICE, MONTH, NOMINAL_A
FROM NOMINAL_A_QUERY
),
NOMINAL_B_CTE (OFFICE, MONTH, NOMINAL_B)
AS
(
SELECT OFFICE, MONTH, NOMINAL_B
FROM NOMINAL_B_QUERY
)

SELECT A.OFFICE, A.MONTH, SUM(A.NOMINAL_A), SUM(B.NOMINAL_B)
FROM NOMINAL_A_CTE AS A INNER JOIN NOMINAL_B_CTE AS B
ON A.OFFICE = B.OFFICE AND A.MOTNTH = B.MONTH

GROUP BY A.OFFICE, A.MONTH
ORDER BY A.OFFICE, A.MONTH;

【讨论】:

    【解决方案3】:

    因此,只需查看您的 2 个结果集和您想要在其唯一键 Office 和月份上使用 queryresult2 将 queryresult1 左外连接的所需输出。此处的 With 子句并没有做任何特别的事情:

        Select A.Office, A.Month, A.Nominal_A, B.Nominal_B
        From (insert query1 here) A  Left Outer Join
                   (Insert query2 here) B on A.Office=B.Office and A.Month=B.Month
    

    我注意到你想要的结果集在 SLO 办公室之后丢失了所有内容,我假设你已经厌倦了打字并且想要展示它们。如果没有,您可以添加过滤器将其取出。

    原始加入版本中缺少两件事,

    1. 您需要在两个查询之间使用左外连接,这样查询 2 中缺少的办公室不会导致 Query1 中的数据消失。
    2. 您需要将联接键完全指定为 Office=Office AND Month=Month。通过仅指定月份,您是在告诉 SQL 为您提供 Query1 和 Query2 中办公室的所有组合。

    【讨论】:

      【解决方案4】:

      感谢您的所有回复先生! 我已经得到答案了

      WITH your_first_query AS (
        SELECT ...
      )
      , your_second_query AS (
        SELECT ...
      )
      SELECT your_first_query.OFFICE
           , your_first_query.MONTH
           , your_first_query.NOMINAL_A
           , your_second_query.NOMINAL_B
      FROM   your_first_query
       FULL
       OUTER
        JOIN your_second_query
          ON your_second_query.OFFICE = your_first_query.OFFICE
         AND your_second_query.MONTH = your_first_query.MONTH
      ORDER
          BY your_first_query.OFFICE
           , your_first_query.MONTH
      ;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-29
        • 1970-01-01
        • 2023-03-05
        • 2010-11-10
        相关资源
        最近更新 更多