Question

I have a sample data below where i want to manipulate the data and generate new database table.

[SAMPLE DATA IMAGE]

I want the output as below image:

[OUTPUT REQUIRED]

This is my query used to get the data:

    CREATE TABLE #tmp_vendorauth_HK ( 
                AuthMaterialKey varchar(30) not null, 
                CustomerNumber varchar(20) null
    ) ON [PRIMARY]


INSERT INTO #tmp_vendorauth_HK  (AuthMaterialKey, CustomerNumber)
SELECT DISTINCT basic_view.SalesOrganization + '@@' + basic_view.DistributionChannel + '@@' + basic_View.Material as AuthkeyMaterial, 
                ISNULL(RTRIM(ACG.CustomerNumber), '000001') + '@@' as CustomerNumber 
FROM            V_BASIC_MTR_ATTR_HK as basic_view
LEFT OUTER JOIN V_AUTH_CUST_GROUP ACG ON basic_view.Material = ACG.Material  
--ORDER BY 1 DESC

**TRUNCATE TABLE VendorAuth_group_HK


INSERT INTO VendorAuth_group_HK (AuthMaterialKey,CustomerNumber)
SELECT      AuthMaterialKey, substring(customernumbers, 1, len(customernumbers)-1)  
FROM        #tmp_vendorauth_HK a WITH(NOLOCK)
CROSS APPLY 
(
    SELECT  LTRIM(RTRIM(CustomerNumber)) + ',' 
    FROM    #tmp_vendorauth_HK TblskuDuplicate 
    WHERE   TblskuDuplicate.AuthMaterialKey= a.AuthMaterialKey

     FOR XML PATH('')
) AS t (customernumbers)**

drop table #tmp_vendorauth_HK

NOTE: I am using SQL Server 2000, therefore I cannot use CTE or CROSS APPLY features of T-SQL

Was it helpful?

Solution

HERE I GO with the simple solution to update my procedure Created a function to populate the details for me and used in my stored procedure.

Details of the function is as below

 CREATE FUNCTION dbo.fn_GET_CustomerNumbers
(
    @vcrMaterial VARCHAR(30)
)
RETURNS VARCHAR(8000)
AS 
BEGIN 

DECLARE             @vcrCustomerNumbers VARCHAR(8000)
SET         @vcrCustomerNumbers = ''

SELECT      @vcrCustomerNumbers = @vcrCustomerNumbers + ',' + CustomerNumber
FROM        tmp_vendorauth_HK 
WHERE       AuthMaterialkey = @vcrMaterial

SELECT      @vcrCustomerNumbers = STUFF(@vcrCustomerNumbers, 1,1, '')
RETURN      @vcrCustomerNumbers 

END
GO

The above function will return me the concatenated numbers which can be used in select statement as the another column can be your input parameter.

OTHER TIPS

The way I've dealt with this before is to work out what is the maximum number of items I'll have in a row, and create that many self-joins onto my data table. Taking your sample data, let's say you have max 6 customer codes for any ProductID.

Now this sql is a bit ugly, but to emulate CROSS APPLY we can do a series of self-joins and nested queries to create a string of customer codes. By targeting the string with maximum length you only retain the record you are interested in.

SELECT Nest4.ProductID,String
FROM (
    SELECT ProductID,MaxStringLength
    FROM (
        SELECT ProductID,max(stringlength) MaxStringLength
        FROM (
            SELECT ProductID,String,len(String) StringLength 
            FROM (
                SELECT 
                ProductID
                ,case when t0.CustomerCode is not null then t0.CustomerCode else '' end
                +','+case when t1.CustomerCode is not null then t1.CustomerCode else '' end
                +','+case when t2.CustomerCode is not null then t2.CustomerCode else '' end
                +','+case when t3.CustomerCode is not null then t3.CustomerCode else '' end
                +','+case when t4.CustomerCode is not null then t4.CustomerCode else '' end
                +','+case when t5.CustomerCode is not null then t5.CustomerCode else '' end
                "String"
                FROM MyTable t0 
                LEFT JOIN MyTable t1 on t0.ProductID=t1.ProductID and t0.CustomerCode<t1.CustomerCode 
                LEFT JOIN MyTable t2 on t0.ProductID=t2.ProductID and t1.CustomerCode<t2.CustomerCode 
                LEFT JOIN MyTable t3 on t0.ProductID=t3.ProductID and t2.CustomerCode<t3.CustomerCode 
                LEFT JOIN MyTable t4 on t0.ProductID=t4.ProductID and t3.CustomerCode<t4.CustomerCode 
                LEFT JOIN MyTable t5 on t0.ProductID=t5.ProductID and t4.CustomerCode<t5.CustomerCode 

            ) AS Nest1
        ) AS Nest2 GROUP BY ProductID
     )  Nest3
) Nest4

JOIN (
            SELECT ProductID,String,len(String) StringLength 
            FROM (
                SELECT 
                t0.ProductID ProductID
                ,case when t0.CustomerCode is not null then t0.CustomerCode else '' end
                +','+case when t1.CustomerCode is not null then t1.CustomerCode else '' end
                +','+case when t2.CustomerCode is not null then t2.CustomerCode else '' end
                +','+case when t3.CustomerCode is not null then t3.CustomerCode else '' end
                +','+case when t4.CustomerCode is not null then t4.CustomerCode else '' end
                +','+case when t5.CustomerCode is not null then t5.CustomerCode else '' end
                "String"
                FROM MyTable s 
                LEFT JOIN MyTable t1 on t0.ProductID=t1.ProductID and t0.CustomerCode<t1.CustomerCode 
                LEFT JOIN MyTable t2 on t0.ProductID=t2.ProductID and t1.CustomerCode<t2.CustomerCode 
                LEFT JOIN MyTable t3 on t0.ProductID=t3.ProductID and t2.CustomerCode<t3.CustomerCode 
                LEFT JOIN MyTable t4 on t0.ProductID=t4.ProductID and t3.CustomerCode<t4.CustomerCode 
                LEFT JOIN MyTable t5 on t0.ProductID=t5.ProductID and t4.CustomerCode<t5.CustomerCode 

            ) AS Nest1
        ) V2
        ON Nest4.ProductID=V2.ProductID and Nest4.MaxStringLength=V2.StringLength
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top