2016-08-04 122 views
1

我在根据列值创建其他行时遇到问题。根据列值添加行

如果我的PageCount = 3,那么我需要有2个额外的行,其中PONo被重复,但ImagePath为每个新行增加1。

我能够获得第一行,但创建ImagePath增加1的附加行是我卡住的地方。

我的结果:
enter image description here

预期结果:
enter image description here

成品:finished values

当前Select语句:

 SELECT PO, CASE WHEN LEFT(u.Path,3)= 'M:\' THEN '\\ServerName\'+RIGHT(u.Path,LEN(u.Path)-3) ELSE u.Path END AS [Imagepath],PAGECOUNT 
FROM OPENQUERY([LinkedServer],'select * from data.vw_purchasing_docs_unc') AS u INNER JOIN 
OPENQUERY([LinkedServer],'select * from data.purchasing_docs') AS d ON u.docid=d.docid 
WHERE (CONVERT(VARCHAR(10),d.STATUS_DATE,120)=CONVERT(VARCHAR(10),GETDATE(),120)) 

批处理文件:

bcp "select d.DOCID,DOC_TYPE,PO,d.STATUS, CASE WHEN LEFT(Path,3)= 'M:\' THEN '\\ServerName'+RIGHT(DWPath,LEN(Path)-3) ELSE Path END AS ImagePath, STATUS_DATE,'No' AS dwimport from openquery([LinkedServer],'select * from data.vw_purchasing_docs_unc') as u INNER JOIN openquery([LinkedServer],'select * from dwdata.purchasing_docs') as d ON u.docid=d.docid WHERE (CONVERT(varchar(10),STATUS_DATE,120)=CONVERT(varchar(10),GETDATE(),120)) AND d.STATUS IN ('FILED - Processing Complete','FILED - Partial Payment','FILED - Confirming') AND DOC_TYPE IN ('CO = Change Order','Purchase Order','CP = Capital Projects','Change Order','PO = Purchase Order','PO','PR = General Operating')" queryout "E:\Data\PO Trigger CSV\PO_Trigger_Doc.csv" -r \n -T -c -t"," -Umv -Smtvwrtst -Pm -q -k 

回答

3
Select ponumber,b.rplc,pagecount 
from table t 
cross apply 
(select replace(imagepath,'f'+cast(n-1) as varchar(100),'f0') as rplc from numbers n where n<=t.pagecount)b 

要创建一个数字表,如果你想知道为什么你需要it.Look here

CREATE TABLE Number (N INT IDENTITY(1,1) PRIMARY KEY NOT NULL); 
GO 

INSERT INTO Number DEFAULT VALUES; 
GO 10000 

使用SELECT语句更新后:

;With cte(ponumber,imagepath,pagecount) 
as 
SELECT PO, CASE WHEN LEFT(u.Path,3)= 'M:\' THEN '\\ServerName\'+RIGHT(u.Path,LEN(u.Path)-3) ELSE u.Path END AS [Imagepath],PAGECOUNT 
FROM OPENQUERY([LinkedServer],'select * from data.vw_purchasing_docs_unc') AS u INNER JOIN 
OPENQUERY([LinkedServer],'select * from data.purchasing_docs') AS d ON u.docid=d.docid 
WHERE (CONVERT(VARCHAR(10),d.STATUS_DATE,120)=CONVERT(VARCHAR(10),GETDATE(),120)) 
) 
select Ponumber,b.rplc,pagecount from cte c 
cross apply 
(select replace(imagepath,'f'+cast((n-1) as varchar(100)),'f0') as rplc from numbers n where n<=c.pagecount)b 
+1

@downvoters:Pease发表评论当你downvote – TheGameiswar

+0

不知道为什么这得到了downvote,但这是SO的本质。许多人会冷静下来,不说话。数字或理货表是正确的做法。 –

+0

谢谢@SeanLange – TheGameiswar

0

如果您想要avoi d附加表格,您可以使用CTE:

WITH Images AS 
(
    SELECT * FROM (VALUES 
    ('C:\Folder', 2), 
    ('D:\Folder', 3)) T(ImagePath, Val) 
), Numbers AS 
(
    SELECT * FROM (VALUES (1),(2),(3),(4)) T(N) 
    UNION ALL 
    SELECT N1.N*4+T.N N FROM (VALUES(1),(2),(3),(4)) T(N) CROSS JOIN Numbers N1 
    WHERE N1.N*4+T.N<=100 
) 
SELECT ImagePath + '\f' + CONVERT(nvarchar(10) ,ROW_NUMBER() OVER (PARTITION BY ImagePath ORDER BY (SELECT 1))) NewPath 
FROM Images 
CROSS APPLY (SELECT TOP(Val) * FROM Numbers) T(N) 

图片是您的源表格。它可以是任何东西,即OPENQUERY。它产生:

NewPath 
------- 
C:\Folder\f1 
C:\Folder\f2 
D:\Folder\f1 
D:\Folder\f2 
D:\Folder\f3