1

次の詳細を含むテーブルがあります。

-- SQL
CREATE TABLE [dbo].[LedgerTbl](
    [LedgerID] [int] NOT NULL,
    [Name] [varchar](50) NOT NULL,
    [ParentID] [int] NULL,
    [Cr Amt] [decimal](8, 2) NOT NULL,
    [Dr Amt] [decimal](8, 2) NOT NULL,
 CONSTRAINT [PK_LedgerTbl] PRIMARY KEY CLUSTERED 
(
    [LedgerID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]

GO
-- Data
INSERT [dbo].[LedgerTbl] ([LedgerID], [Name], [ParentID], [Cr Amt], [Dr Amt]) VALUES (17, N'L1 Ledger', 20, CAST(25252.00 AS Decimal(8, 2)), CAST(0.00 AS Decimal(8, 2)))
INSERT [dbo].[LedgerTbl] ([LedgerID], [Name], [ParentID], [Cr Amt], [Dr Amt]) VALUES (18, N'L2 Ledger', 20, CAST(9000.00 AS Decimal(8, 2)), CAST(0.00 AS Decimal(8, 2)))
INSERT [dbo].[LedgerTbl] ([LedgerID], [Name], [ParentID], [Cr Amt], [Dr Amt]) VALUES (20, N'Master Ledger', NULL, CAST(0.00 AS Decimal(8, 2)), CAST(6900.00 AS Decimal(8, 2)))
INSERT [dbo].[LedgerTbl] ([LedgerID], [Name], [ParentID], [Cr Amt], [Dr Amt]) VALUES (45, N'L1.1 Ledger', 17, CAST(361.00 AS Decimal(8, 2)), CAST(0.00 AS Decimal(8, 2)))
INSERT [dbo].[LedgerTbl] ([LedgerID], [Name], [ParentID], [Cr Amt], [Dr Amt]) VALUES (46, N'L1.1.1 Ledger', 45, CAST(6541.00 AS Decimal(8, 2)), CAST(0.00 AS Decimal(8, 2)))
INSERT [dbo].[LedgerTbl] ([LedgerID], [Name], [ParentID], [Cr Amt], [Dr Amt]) VALUES (47, N'L1.1.2 Ledger', 45, CAST(321.00 AS Decimal(8, 2)), CAST(0.00 AS Decimal(8, 2)))

GO
ALTER TABLE [dbo].[LedgerTbl]  WITH CHECK ADD  CONSTRAINT [FK_LedgerTbl_LedgerTbl] FOREIGN KEY([ParentID])
REFERENCES [dbo].[LedgerTbl] ([LedgerID])
GO
ALTER TABLE [dbo].[LedgerTbl] CHECK CONSTRAINT [FK_LedgerTbl_LedgerTbl]
GO

サンプルデータは次のようになります。

LedgerID    Name            ParentID     Cr Amt     Dr Amt
20          Master Ledger   NULL           0.00    6900.00
17          L1 Ledger       20         25252.00       0.00
18          L2 Ledger       20          9000.00       0.00
45          L1.1 Ledger     17           361.00       0.00
46          L1.1.1 Ledger   45          6541.00       0.00
47          L1.1.2 Ledger   45           321.00       0.00 

上記の LedgerID 20 の表では、この台帳に直接的または間接的にリンクされているすべてのリンクされた台帳 (すべてのレベル) が必要です。上の表では、すべての元帳が 20 に直接リンクされています。
元帳 20 の残高を照会すると、次のように表示されます (すべてのレベルからリンクされたすべての元帳のすべての Cr Amt と Dr Amount を追加します)。

Cr Bal        Dr Bal
41475.00    6900.00

すべての元帳が 20 に直接的または間接的にリンクされているため、すべての Cr Amt と Dr Amt が合計されます。
リンクされている/リンクされていないすべての LedgerID の Cr Amt と Dr Amt の合計を追加すると、結果は次のようになります。

LedgerID   Tot. Cr Amt  Tot Dr Amt
20         41475.00    6900.00
18          9000.00       0.00
17         32475.00       0.00
45          7223.00       0.00
46          6541.00       0.00
47           321.00       0.00

元帳 18 には子元帳がないため、残高を追加する必要がないことに注意してください。

CTEまたはその他の方法を使用してこれを達成するのを手伝ってください。前もって感謝します。

これは私が試したことです:

;WITH RecursiveLedger(LedgerID, [Name],[Cr Amt], [Dr Amt], LevelNum, LevelIndex, ParentID)
AS (
       SELECT lg.LedgerID,
              lg.[Name],
              lg.[Cr Amt],
              lg.[Dr Amt],
              1 AS LevelNum,
              CAST(lg.LedgerID AS VARCHAR) AS LevelIndex,
              lg.ParentID 
       FROM   [LedgerTbl] lg
       WHERE  lg.ParentID IS NULL
       UNION ALL
       SELECT l.LedgerID,
              l.[Name],
              l.[Cr Amt],
              l.[Dr Amt],
              r.LevelNum + 1 AS LevelNum,
              CAST(r.LevelIndex + '.' + CAST(ROW_NUMBER() OVER(ORDER BY l.ParentID) AS VARCHAR) AS VARCHAR) AS LevelIndex,
              l.ParentID 
       FROM   [LedgerTbl] l,
              RecursiveLedger r
       WHERE  r.LedgerID = l.ParentID
   ) SELECT * FROM   RecursiveLedger
4

1 に答える 1

1
with anc as 
(
    select ledgerid, parentid
    from [LedgerTbl] where parentid is not null
    union all
    select c.ledgerid, isnull(anc.parentid, anc.parentid)
    from anc 
        inner join [LedgerTbl] c on anc.ledgerid = c.parentid
), anc2 as
(
    select * from anc
    union all
    select ledgerid, ledgerid
    from ledgertbl 
)
select  a.parentid,
        sum(l.[Cr Amt]), 
        sum(l.[dr Amt]) 
from anc2 a
    inner join ledgertbl l on a.ledgerid = l.ledgerid
group by a.parentid
order by a.parentid;
于 2012-07-19T15:23:02.507 に答える