0

我有两个表,如下所示。

第一个表

在此处输入图像描述

考虑到表之间没有这种关系。

所以我需要我的结果表应该如下所示。

在此处输入图像描述

我怎样才能做到这一点?

4

4 回答 4

2

“AcctRef”,在您的 DebitNoteTable 中,是一个“重复列”

那是一个很大的,巨大的,不可以:)

您的借记表应如下所示:

Debit No  AcctRef
--------  -------
DN1       CMP1
DN1       CMP3
DN1       CMP6
...

然后你可以做一个简单的“加入”;)

这是规范化的一个很好的概述。如果可能的话,我绝对鼓励您重新访问您的架构:

如果你不能,那么我猜“Plan B”会写一个程序:

  • 读取所有价格并将它们存储在表格中

  • 读取所有借方的所有 AcctRef

  • 将每个 AcctRef 解析为单独的应计项目

  • 打印每个应计项目的价格和每个借方

这实际上意味着读取整个数据库中的所有数据,然后手动重新组织它。如果您要这样做,为什么首先要使用数据库呢?

PS:不幸的是,您为表格使用了位图。文字会更好;)

于 2012-08-17T05:13:26.770 回答
1

尝试这个:

由于该表未标准化,因此您必须执行以下步骤。在列中保留逗号分隔值是一个坏主意。对于表上的任何类型的操作,您都必须拆分它..

第 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


SQL 小提琴演示

于 2012-08-17T05:38:22.047 回答
0

我想它应该是这样的:

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 是绝对正确的,但也许你不能改变表结构)

于 2012-08-17T05:23:58.360 回答
0
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
于 2012-08-17T05:49:29.767 回答