Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何自联接表?_Sql_Sql Server_Join - Fatal编程技术网

Sql 如何自联接表?

Sql 如何自联接表?,sql,sql-server,join,Sql,Sql Server,Join,更新查询后,我得到了以下与此查询相关的输出 我写下面的查询是为了把两组记录放在一起 WITH cte AS (SELECT SubSubsidaryAccountCode, sum(Debit) AS debit, sum(Credit) AS credit, ROW_NUMBER() over (PARTITION BY SubSubsidaryAccountCode O

更新查询后,我得到了以下与此查询相关的输出

我写下面的查询是为了把两组记录放在一起

 WITH cte AS
  (SELECT SubSubsidaryAccountCode,
          sum(Debit) AS debit,
          sum(Credit) AS credit,
          ROW_NUMBER() over (PARTITION BY SubSubsidaryAccountCode
                             ORDER BY SubSubsidaryAccountCode) AS RN
   FROM TBLLedgerLevel4
   WHERE SubSubsidaryAccountCode LIKE '4%'
     OR SubSubsidaryAccountCode LIKE '5%'
   GROUP BY SubSubsidaryAccountCode ),
     cte2 AS
  (SELECT *
   FROM TBLLevel4)
SELECT a.SubSubsidaryAccountCode ,
       c.SubSubsidaryAccountName AS RevenuName ,
       sum(a.Debit) AS debit ,
       b.SubSubsidaryAccountCode AS SubsidaryAccount2 ,
       d.SubSubsidaryAccountName AS ExpenseName ,
       sum(b.Credit) AS credit
FROM cte a
JOIN cte2 c ON a.SubSubsidaryAccountCode = c.SubSubsidaryAccountCode
FULL JOIN cte b ON a.RN = b.RN
JOIN cte2 d ON b.SubSubsidaryAccountCode=d.SubSubsidaryAccountCode
WHERE a.SubSubsidaryAccountCode LIKE '4%'
  AND b.SubSubsidaryAccountCode LIKE '5%'
GROUP BY a.SubSubsidaryAccountCode,
         b.SubSubsidaryAccountCode,
         c.SubSubsidaryAccountName,
         d.SubSubsidaryAccountName
输出:

 SubSubsidaryAccountCode    RevenuName  debit   SubsidaryAccount2   ExpenseName credit
     4-106-1001-10026        Cash Sale  52889    5-105-1005-10011   Rf Battles  18091289
     4-108-1012-10037        New Sale1  1000     5-105-1005-10011   Rf Battles  18091289

上述输出包含以4和5开头的两个会计代码的记录。现在,以4开头的会计代码的记录已填充,并且符合所需结果,但以会计代码5开头的第二行记录没有任何值,并且其中必须有空值。请请帮我解决这个问题。

您的示例使填充的记录和为空的记录看起来是任意的,就像您只想将两组记录相邻放置一样。您可以通过添加一个
行号()
并在
左连接中使用该行号来实现这一点:

;with cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY MainAccountID ORDER BY LedgerDate) AS RN
              FROM TBLLedgerLevel1
              )
    SELECT  a.LedgerDate
          , a.MainAccountId
          , a.VoucherCode
          , a.Debit
          , b.LedgerDate AS Date2
          , b.MainAccountId AS MainAccount2
          , b.VoucherCode AS VoucherCode2
          , b.Credit  
      FROM cte a 
      LEFT JOIN cte b   
        ON a.RN = b.RN 
         and b.MainAccountId='5' 
      WHERE  a.MainAccountId='4' 
如果
maincountid='5'
记录可能多于
maincountid='4'
记录,则您可能需要
完全联接
,并可以使用
COALESCE()
选择要显示的字段。而且,在我看来,使用别名可以显著地清理代码

更新:对此不确定,但要添加名称,您需要向
TBLLevel1
添加一个
JOIN
,类似于:

;with cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY MainAccountID ORDER BY LedgerDate) AS RN
              FROM TBLLedgerLevel1
              )
    SELECT  a.LedgerDate
          , a.MainAccountId
          , a.VoucherCode
          , a.Debit
          , b.LedgerDate AS Date2
          , b.MainAccountId AS MainAccount2
          , b.VoucherCode AS VoucherCode2
          , b.Credit  
              , c.MainAccountName
      FROM cte a 
      JOIN TBLLevel1 c
         ON a.MainAccountID = c.ID
      LEFT JOIN cte b   
        ON a.RN = b.RN 
         and b.MainAccountId='5' 
      WHERE  a.MainAccountId='4' 

如果
TBLLevel1
表中每个
maincountid
有超过1条记录,则需要向
JOIN
添加条件,以确保只包含正确的值。

首先,您应该决定使用哪个数据库。SQL Server还是MySQL?@GordonLinoff SQL Server我已经删除了我的SQL Server的标记。你是说你想显示你已经拥有的四条记录(其中MyAccountId=4),并且在MyAccountId=5的位置再显示一条记录?只是想弄清楚是什么决定了哪个帐户已填充,哪些帐户为
NULL
?请帮助从TBLLevel1获取我的主帐户名,因为mainCountId=4的mainCountName=Revenue。如何使用上述查询检索此信息?您应该能够将字段添加到
选择列表中,您的问题不清楚正确的名称来自何处,可能需要一些示例数据。名称来自另一个名为TBLLevel1的表,该表包含id=4和name=Revenue。您可以编辑您的答案吗?我如何使用上面的选择query@sheikhmuzammil总的来说,表的结构还不清楚,但有关如何合并的想法,请参见更新。