簡體   English   中英

sql運行總計或余額

[英]sql running total or Balance

我需要像運行余額或總計一樣運行VoucherNo串聯。將前一個VoucherNo連接到當前VoucherNo明智的做法,如圖所示 在此處輸入圖片說明

查詢是:

select 
v.VoucherDate,v.VoucherNo,v.VoucherType,v.Narration,SUM(v.Debit) Debit , SUM(v.Credit) Credit,dbo.GetBalance(v.CompanyProfileId,v.AccountCode,v.VoucherDate ,SUM(v.Debit), SUM(v.Credit)) Balance
from AcVoucher v
where v.VoucherDate Between '2016-03-24' and '2016-03-30' and v.CompanyProfileId = 2 and v.AccountCode = '05010001'
group by v.VoucherNo,v.VoucherDate,v.VoucherType,v.Narration,v.CompanyProfileId,v.AccountCode

架構:

    GO
/****** Object:  Table [dbo].[AcVoucher]    Script Date: 03/30/2016 3:47:02 PM ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[AcVoucher](
    [Id] [bigint] IDENTITY(1,1) NOT NULL,
    [CompanyProfileId] [int] NOT NULL,
    [AccountCode] [nvarchar](50) NOT NULL,
    [VoucherNo] [bigint] NOT NULL,
    [VoucherType] [nvarchar](5) NOT NULL,
    [VoucherDate] [datetime] NOT NULL,
    [Narration] [nvarchar](500) NULL,
    [Debit] [float] NOT NULL,
    [Credit] [float] NOT NULL,
    [TaxPercentage] [float] NULL,
    [DiscountPercentage] [float] NULL,
    [CreatedBy] [int] NULL,
    [CreatedDate] [datetime] NULL,
 CONSTRAINT [PK_ACVoucher_1] PRIMARY KEY CLUSTERED 
(
    [Id] 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

您可以使用與SQL Server中字符串連接基本相同的邏輯來執行此操作。 唯一的區別是where子句。

一個關鍵問題是串聯的順序。 這在問題中並不明顯,因此我在查詢中添加了一個minid ,並用於(以相反的順序)選擇要組合在一起的id:

with v as (
      select v.VoucherDate, v.VoucherNo, v.VoucherType, v.Narration,
             SUM(v.Debit) as Debit , SUM(v.Credit) as Credit, 
             dbo.GetBalance(v.CompanyProfileId, v.AccountCode, v.VoucherDate,
                            SUM(v.Debit), SUM(v.Credit)
                           ) as Balance,
             min(id) as minid
      from AcVoucher v
      where v.VoucherDate Between '2016-03-24' and '2016-03-30' and
            v.CompanyProfileId = 2 and v.AccountCode = '05010001'
      group by v.VoucherNo, v.VoucherDate, v.VoucherType,v.Narration, v.CompanyProfileId, v.AccountCode
     )
select v.*,
       stuff((select ',' + cast(v2.VoucherNo as varchar(8000))
              from v v2
              where v2.minid >= v.minid
              for xml path ('')
             ), 1, 1, '') as RunningConcat
from v;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM