2012-08-17 69 views

回答

2

「AcctRef」,在你的DebitNoteTable,是"repeating column"

這是一個大的,巨大的,沒有沒有:)

你借記表應該是這個樣子:

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

那麼你可以做一個簡單的「加盟」;)

下面是正常化的一個很好的概述。我絕對鼓勵你重新審視你的架構,如果可能的話:

如果不能,然後我猜「B計劃」是寫一個程序:

  • 讀取所有的價格,並將其存儲在一個表中

  • 讀取所有的t他AcctRef對所有借記

  • 解析每個AcctRef成單獨的應計

  • 版畫的價格和每個借記每個每股收益

這實際上意味着在整個數據庫中讀取所有數據和然後手動重新組織它。如果你打算這麼做的話,爲什麼首先要打擾一個數據庫呢?

PS: 不幸的是,您使用了位圖來表格。文本將是更加美好;)

+0

這裏通過考慮來自表-1的AccRef和來自表-2的AccrualNo,我們需要找到結果。這裏通常意味着這兩個。 – 2012-08-17 05:26:14

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是權是絕對的,但也許你不能改變表結構)

+0

它不工作...如果可能,請給一些其他解決方案 – 2012-08-17 05:35:26

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, @[email protected])) 
     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 Fiddle Demo

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 
相關問題