我有两个表,如下所示。
考虑到表之间没有这种关系。
所以我需要我的结果表应该如下所示。
我怎样才能做到这一点?
“AcctRef”,在您的 DebitNoteTable 中,是一个“重复列”。
那是一个很大的,巨大的,不可以:)
您的借记表应如下所示:
Debit No AcctRef
-------- -------
DN1 CMP1
DN1 CMP3
DN1 CMP6
...
然后你可以做一个简单的“加入”;)
这是规范化的一个很好的概述。如果可能的话,我绝对鼓励您重新访问您的架构:
如果你不能,那么我猜“Plan B”会写一个程序:
读取所有价格并将它们存储在表格中
读取所有借方的所有 AcctRef
将每个 AcctRef 解析为单独的应计项目
打印每个应计项目的价格和每个借方
这实际上意味着读取整个数据库中的所有数据,然后手动重新组织它。如果您要这样做,为什么首先要使用数据库呢?
PS:不幸的是,您为表格使用了位图。文字会更好;)
尝试这个:
由于该表未标准化,因此您必须执行以下步骤。在列中保留逗号分隔值是一个坏主意。对于表上的任何类型的操作,您都必须拆分它..
第 1 步:您必须创建以下函数来拆分 accRef 列
create FUNCTION [dbo].[SDF_SplitString]
(
@sString varchar(2048),
@cDelimiter char(1)
)
RETURNS @tParts TABLE ( part varchar(2048) )
AS
BEGIN
if @sString is null return
declare @iStart int,
@iPos int
if substring( @sString, 1, 1 ) = @cDelimiter
begin
set @iStart = 2
insert into @tParts
values( null )
end
else
set @iStart = 1
while 1=1
begin
set @iPos = charindex( @cDelimiter, @sString, @iStart )
if @iPos = 0
set @iPos = len( @sString )+1
if @iPos - @iStart > 0
insert into @tParts
values ( substring( @sString, @iStart, @iPos-@iStart ))
else
insert into @tParts
values( null )
set @iStart = @iPos+1
if @iStart > len( @sString )
break
end
RETURN
END
第2步:
使用此查询获取结果
with cte as(
select * from DebitNote cross apply dbo.SDF_SplitString(AccRef,','))
select part,price,[Debit No]=STUFF((SELECT ', ' + DebitNo
FROM cte b
WHERE b.part = a.part
FOR XML PATH('')), 1, 2, '')
FROM cte a join AccrualNote
on part=AccrualNo
GROUP BY part,price
我想它应该是这样的:
SELECT a.Accrual_No, a.Price, d.Debit_no FROM AccrualNote AS a, DebitNote as d
WHERE a.Accrual_No IN d.AccRef
接下来,您需要为使用此查询获得的记录创建一个循环(只需使用 phpMyAdmin
(当然 paulsm4 是绝对正确的,但也许你不能改变表结构)
CREATE FUNCTION [dbo].[F_Get_DebitNo] ( @AccrualNo VARCHAR(20) )
RETURNS VARCHAR(100)
AS
BEGIN
DECLARE @DebitNo VARCHAR(100)
SET @DebitNo = ''
SELECT @DebitNo = @DebitNo + ',' + DebitNo
FROM DebitNote
WHERE CHARINDEX(@AccrualNo, AccRef) > 0
SELECT @DebitNo = RIGHT(@DebitNo, LEN(@DebitNo) - 1)
RETURN @DebitNo
END
sql 运行良好,我已经测试过了,您只需要创建一个标量值函数,如下所示。
SELECT AccrualNo ,
Price ,
dbo.F_Get_DebitNo(AccrualNo) FROM AccrualNote