【问题标题】:How to combine two completely different SQL queries into one result如何将两个完全不同的 SQL 查询组合成一个结果
【发布时间】:2019-01-09 03:38:36
【问题描述】:

我对 SQL 查询很陌生,需要一些帮助。

我有两个不同的 SQL 查询,我希望将两者的结果放在一个结果中。

查询 1:

SELECT 
    gbkmut.bkstnr_sub, 
    MAX(orkrg.refer) AS oms25, 
    MAX(gbkmut.docnumber) AS YourRef, 
    MIN(gbkmut.datum) AS datum, 
    cicmpy.debcode AS delv_debnr, 
    MAX(cicmpy.cmp_name) AS cmp_name,
    MAX(gbkmut.datum) AS latest_deldat, 
FROM 
    gbkmut 
INNER JOIN 
    orkrg ON gbkmut.bkstnr_sub = orkrg.ordernr
INNER JOIN
    cicmpy ON orkrg.verzdebnr  = cicmpy.debnr
INNER JOIN 
    items ON gbkmut.artcode = items.itemcode AND items.type <> 'P'
INNER JOIN 
    magaz ON gbkmut.warehouse = magaz.magcode AND magaz.blokkeer = 0 
WHERE 
    (gbkmut.transsubtype IN ('B','H')
     AND gbkmut.freefield1 = 'V'
     AND gbkmut.Blockitem = 0
     AND gbkmut.afldat <= GETDATE()) 
    AND gbkmut.Checked = 1 
    AND (orkrg.ordbv_afdr = 0 OR (orkrg.ordbv_afdr = 1 AND orkrg.ordbv_afgd = 1)) 
GROUP BY 
    gbkmut.bkstnr_sub, 
    gbkmut.afldat, 
    cicmpy.debcode
ORDER BY 
    gbkmut.bkstnr_sub DESC

查询 2:

SELECT TOP 1000 
    [Debtor code],
    [Outstanding Amount]
FROM 
    [456].[dbo].[GRV_DebtorOutstanding]

[债务人代码] 和 cicmpy.debcode 对于连接是相同的

两个查询的一些示例结果:

查询 1 列:

Ordernumber, Order description, Your reference, Orderdate, Debtor code, Debtor name, Order delivery date

   20093    NULL    Bestel.: 20093  2018-07-31 00:00:00.000                60089    Restaurant Enkhuizen    2018-07-31 00:00:00.000
   20092    NULL    Bestel.: 20092  2018-07-31 00:00:00.000                60089    Restaurant Enkhuizen    2018-07-31 00:00:00.000
   20088    NULL    Bestel.: 20088  2018-07-05 00:00:00.000                60105    Brasserie Pigalle   2018-07-05 00:00:00.000

查询 2:

列:债务人代码、未偿还总额

Debtor code Outstanding Amount
               60086    -30,65
               60092    -121
               60089    -5000
               60130    1000

我想将未结清总额添加到第一个查询中。

我尝试使用子选择,但出现错误:

子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。

由于不同的列,联合也可能是不可能的。

我想将其用于报告目的,当然可以通过 Excel 和 vlookup 解决它,但我想在 SQL 中完成它以了解有关 SQL 的更多信息。

任何帮助都会很棒。谢谢

【问题讨论】:

  • 如果您可以使用VLOOKUP,那么您可以将结果放入临时表并最有可能进行左连接:docs.microsoft.com/en-us/sql/t-sql/statements/…
  • 请发布使用子查询的尝试,以便我们告诉您为什么遇到错误。
  • 您可以将第二个查询设为子查询,然后加入它——这两个查询如何加入呢?你怎么知道 1 中的哪一行要从 2 中添加债务?
  • 也许这就是你要找的东西:stackoverflow.com/questions/11574442/…

标签: sql sql-server


【解决方案1】:

将它们放在子查询中并将它们连接在一起

SELECT * FROM
(
SELECT 
    gbkmut.bkstnr_sub, 
    MAX(orkrg.refer) AS oms25, 
    MAX(gbkmut.docnumber) AS YourRef, 
    MIN(gbkmut.datum) AS datum, 
    cicmpy.debcode AS delv_debnr, 
    MAX(cicmpy.cmp_name) AS cmp_name,
    MAX(gbkmut.datum) AS latest_deldat, 
FROM 
    gbkmut 
INNER JOIN 
    orkrg ON gbkmut.bkstnr_sub = orkrg.ordernr
INNER JOIN
    cicmpy ON orkrg.verzdebnr  = cicmpy.debnr
INNER JOIN 
    items ON gbkmut.artcode = items.itemcode AND items.type <> 'P'
INNER JOIN 
    magaz ON gbkmut.warehouse = magaz.magcode AND magaz.blokkeer = 0 
WHERE 
    (gbkmut.transsubtype IN ('B','H')
     AND gbkmut.freefield1 = 'V'
     AND gbkmut.Blockitem = 0
     AND gbkmut.afldat <= GETDATE()) 
    AND gbkmut.Checked = 1 
    AND (orkrg.ordbv_afdr = 0 OR (orkrg.ordbv_afdr = 1 AND orkrg.ordbv_afgd = 1)) 
GROUP BY 
    gbkmut.bkstnr_sub, 
    gbkmut.afldat, 
    cicmpy.debcode
ORDER BY 
    gbkmut.bkstnr_sub DESC
) T1
JOIN 
(
    SELECT TOP 1000 
        [Debtor code],
        [Outstanding Amount]
    FROM 
        [456].[dbo].[GRV_DebtorOutstanding]
) T2 ON T2.[Debtor code] = T1.delv_debnr

【讨论】:

    【解决方案2】:
        Select * from (
    
    
        SELECT 
        gbkmut.bkstnr_sub, 
        MAX(orkrg.refer) AS oms25, 
        MAX(gbkmut.docnumber) AS YourRef, 
        MIN(gbkmut.datum) AS datum, 
        cicmpy.debcode AS delv_debnr, 
        MAX(cicmpy.cmp_name) AS cmp_name,
        MAX(gbkmut.datum) AS latest_deldat, 
    FROM 
        gbkmut 
    INNER JOIN 
        orkrg ON gbkmut.bkstnr_sub = orkrg.ordernr
    INNER JOIN
        cicmpy ON orkrg.verzdebnr  = cicmpy.debnr
    INNER JOIN 
        items ON gbkmut.artcode = items.itemcode AND items.type <> 'P'
    INNER JOIN 
        magaz ON gbkmut.warehouse = magaz.magcode AND magaz.blokkeer = 0 
    WHERE 
        (gbkmut.transsubtype IN ('B','H')
         AND gbkmut.freefield1 = 'V'
         AND gbkmut.Blockitem = 0
         AND gbkmut.afldat <= GETDATE()) 
        AND gbkmut.Checked = 1 
        AND (orkrg.ordbv_afdr = 0 OR (orkrg.ordbv_afdr = 1 AND orkrg.ordbv_afgd = 1)) 
    GROUP BY 
        gbkmut.bkstnr_sub, 
        gbkmut.afldat, 
        cicmpy.debcode
    
    
        Union all
    
        SELECT TOP 1000 
        bkstnr_sub as '',
        oms25 as 0,
        YourRef as 0, 
        datum as 0,
        delv_debnr as 0, 
        cmp_name as ''
        [Debtor code],
        latest_deldat as NULL
        [Outstanding Amount]
    FROM 
        [456].[dbo].[GRV_DebtorOutstanding]
     ) as outertable
    

    【讨论】:

    • 您可以通过与第一个查询相同的列别名来完成。我已将其放入子选择中,因此您也可以使用外部选择进行其他操作。
    【解决方案3】:

    您可以通过将第二个查询设为公用表表达式来做到这一点:

    WITH agg
    AS (SELECT TOP 1000
               [Debtor code]
             , [Outstanding Amount]
        FROM [456].[dbo].[GRV_DebtorOutstanding])
    SELECT gbkmut.bkstnr_sub
         , MAX(orkrg.refer) AS oms25
         , MAX(gbkmut.docnumber) AS YourRef
         , MIN(gbkmut.datum) AS datum
         , cicmpy.debcode AS delv_debnr
         , MAX(cicmpy.cmp_name) AS cmp_name
         , MAX(gbkmut.datum) AS latest_deldat
         , ISNULL(agg.[Outstanding Amount],0) AS [Outstanding Amount]
    FROM gbkmut
        INNER JOIN orkrg ON gbkmut.bkstnr_sub = orkrg.ordernr
        INNER JOIN cicmpy ON orkrg.verzdebnr = cicmpy.debnr
        INNER JOIN items ON gbkmut.artcode = items.itemcode
                            AND items.type <> 'P'
        INNER JOIN magaz ON gbkmut.warehouse = magaz.magcode
                            AND magaz.blokkeer = 0
        LEFT OUTER JOIN agg ON agg.[Debtor code] = cicmpy.debcode
    WHERE (
              gbkmut.transsubtype IN ( 'B', 'H' )
              AND gbkmut.freefield1 = 'V'
              AND gbkmut.Blockitem = 0
              AND gbkmut.afldat <= GETDATE()
          )
          AND gbkmut.Checked = 1
          AND
          (
              orkrg.ordbv_afdr = 0
              OR
              (
                  orkrg.ordbv_afdr = 1
                  AND orkrg.ordbv_afgd = 1
              )
          )
    GROUP BY gbkmut.bkstnr_sub
           , gbkmut.afldat
           , cicmpy.debcode
           , agg.[Outstanding Amount]
    ORDER BY gbkmut.bkstnr_sub DESC;
    

    【讨论】:

      猜你喜欢
      • 2015-10-08
      • 1970-01-01
      • 2021-10-09
      • 1970-01-01
      • 2021-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多