जुआन रुइज़ डी कास्टिला ने मेरा दिया गया जवाब बढ़ाया और अपनी "लिंक" -टेबल के लिए अपनी आंखें खोली।
यह मेरा अंतिम सुझाव है एक और CTE में अपनी समस्या को हल करने:
CREATE TABLE MiscValues
([docID] varchar(10) ,[rowNumber] int, [Column1] varchar(100), [Column2] varchar(100)
, [Column3] varchar(100))
;
INSERT INTO MiscValues
([docID],[rowNumber],[Column1], [Column2], [Column3])
VALUES
('D0001',1, 'PartNumber', 'X0455', NULL),
('D0001',2, 'Prio', '1', NULL),
('D0001',3, 'Plant1', NULL, NULL),
('D0001',4, 'Plant2', 'PlantB', NULL),
('D0001',5, 'Plant3', 'PlantC', NULL),
('D0001',6, 'Plant4', NULL, NULL),
('D0001',7, 'Color1', 'white', NULL),
('D0001',8, 'Color2', 'black', NULL),
('D0001',9, 'Color3', 'blue', NULL),
('D0001',10, 'Material', 'MA123', NULL),
('D0001',11, 'Length', NULL, '10.87'),
('D0002',1, 'PartNumber', 'X0326', NULL),
('D0002',2, 'Prio', '2', NULL),
('D0002',3, 'Plant1', 'PlantA', NULL),
('D0002',4, 'Plant2', NULL, NULL),
('D0002',5, 'Plant3', 'PlantC', NULL),
('D0002',6, 'Plant4', 'PlantD', NULL),
('D0002',7, 'Color1', NULL, NULL),
('D0002',8, 'Color2', 'black', NULL),
('D0002',9, 'Color3', NULL, NULL),
('D0002',10, 'Color4', 'yellow', NULL),
('D0002',11, 'Material', 'MA456', NULL),
('D0002',12, 'Length', NULL, '16.43')
;
CREATE TABLE LookUp([docID] varchar(10), [docType] varchar(100), [PartNumber] varchar(100), [internalID] varchar(100));
INSERT INTO LookUp([docID],[docType],[PartNumber], [internalID])
VALUES
('D0305415', 'docTypeSub', 'X0455', null),
('D0157632', 'docTypeMain', null, 'XY05570-XY05571'),
('D0181511', 'docTypeMain',null, 'XY05572-XY05573'),
('D0157633', 'docTypeMain', null, 'XY06380-XY06381'),
('D0156037', 'docTypeSub', 'X0326', null),
('D0151874', 'docTypeMain', null, 'XY05345');
CREATE TABLE Links ([docIDTop] varchar(10), [docIDBottom] varchar(10));
INSERT INTO Links ([docIDTop],[docIDBottom])
VALUES
('D0157632', 'D0305415'),
('D0181511', 'D0305415'),
('D0157633', 'D0305415'),
('D0151874', 'D0156037');
WITH CTE_no_nums
AS
(
SELECT docID,
CASE
WHEN PATINDEX('%[0-9]%',column1) > 0
THEN SUBSTRING(column1,0,PATINDEX('%[0-9]%',column1))
ELSE column1
END AS cols,
COALESCE(column2,column3) AS vals
FROM miscValues
WHERE column2 IS NOT NULL
OR column3 IS NOT NULL
),
CTE_Pivot
AS
(
SELECT docID,partNumber,prio,[length],material
FROM CTE_no_nums
PIVOT
(
MAX(vals) FOR cols IN (partNumber,prio,[length],material)
) pvt
),
CTE_InternalIDs AS
(
SELECT *
,STUFF
(
(SELECT ', ' + internalID
FROM LookUp AS L2
INNER JOIN Links L ON L2.docID=L.docIDTop
WHERE L2.internalID IS NOT NULL
AND L.docIDBottom=L1.docID
FOR XML PATH('')
),1,2,'') AS ConcatenatedInternalIDs
FROM LookUp AS L1
WHERE L1.internalID IS NULL
)
SELECT A.docId + ' # ' + B.vals AS [DocID # Plant],
A.docID,
A.partNumber,
A.prio,
B.vals AS Plant,
A.partNumber + '#' + A.material + '#' + A.[length] AS Identification,
A.[length],
SUBSTRING(CA.colors,0,LEN(CA.colors)) colors, --substring removes last comma
IIDs.ConcatenatedInternalIDs
FROM CTE_Pivot A
INNER JOIN CTE_no_nums B
ON A.docID = B.docID
AND B.cols = 'Plant'
INNER JOIN CTE_InternalIDs AS IIDs ON A.partNumber = IIDs.PartNumber
CROSS APPLY ( SELECT vals + ','
FROM CTE_no_nums C
WHERE cols = 'Color'
AND C.docID = A.docID
FOR XML PATH('')
) CA(colors)
;
--Clean up...
/*
DROP TABLE Links;
DROP TABLE LookUp;
DROP TABLE miscValues;
*/
ऊपर इस के साथ वापस आता है:
D0001 # PlantB D0001 X0455 1 PlantB X0455#MA123#10.87 10.87 white,black,blue XY05570-XY05571, XY05572-XY05573, XY06380-XY06381
D0001 # PlantC D0001 X0455 1 PlantC X0455#MA123#10.87 10.87 white,black,blue XY05570-XY05571, XY05572-XY05573, XY06380-XY06381
D0002 # PlantA D0002 X0326 2 PlantA X0326#MA456#16.43 16.43 black,yellow XY05345
D0002 # PlantC D0002 X0326 2 PlantC X0326#MA456#16.43 16.43 black,yellow XY05345
D0002 # PlantD D0002 X0326 2 PlantD X0326#MA456#16.43 16.43 black,yellow XY05345
संपादित करें: यहाँ से पर तुम मेरा पहला मिल जाएगा उत्तर (जुआन रुइज़ के उत्तर को समझने के लिए):
मुझे बिल्कुल यकीन नहीं है, अगर मैं आपको सही ढंग से समझता हूं ... आप सभी आंतरिक आईडी प्रविष्टियों के साथ अपनी क्वेरी में एक समेकित सूची जोड़ना चाहते हैं लुकअप के भाग संख्या को झुकाव।
समस्या आपके पास: कोई अंतर्निहित सॉर्ट क्रम है ...
VALUES
('D0305415', 'docTypeSub', 'X0455', null),
('D0157632', 'docTypeMain', null, 'XY05570-XY05571'),
('D0181511', 'docTypeMain',null, 'XY05572-XY05573'),
('D0157633', 'docTypeMain', null, 'XY06380-XY06381'),
('D0156037', 'docTypeSub', 'X0326', null),
('D0151874', 'docTypeMain', null, 'XY05345');
का आपका प्रविष्टि लगता है करने के लिए "बाँध" मूल्यों "XY05570-XY05571", "XY05572-XY05573" और पार्टनंबर "X0455" और पार्टनंबर "X0326" के लिए "XY06380-XY06381" मान "XY05345"। लेकिन यह गलत है !!!
आप या तो इसे इस
VALUES
('D0305415', 'docTypeSub', 'X0455', null),
('D0157632', 'docTypeMain', 'X0455', 'XY05570-XY05571'),
('D0181511', 'docTypeMain','X0455', 'XY05572-XY05573'),
('D0157633', 'docTypeMain', 'X0455', 'XY06380-XY06381'),
('D0156037', 'docTypeSub', 'X0326', null),
('D0151874', 'docTypeMain', 'X0326', 'XY05345');
की तरह कर सकते हैं या आप एक पहचान स्तंभ जोड़ सकते हैं और internalID शून्य है होने के बीच सभी प्रविष्टियों के साथ बेला के आसपास जा सकता है।
पहले साथ
(प्रत्येक पंक्ति के लिए PARTNUMBER कॉलम भरने) आप इस तरह श्रेणीबद्ध सूची प्राप्त कर सकते हैं:
:
select c.docType AS c_docTypeSub, c.docID AS C_docID, c.PartNumber AS C_PartNumber ,
b.docIDTop AS B_docIdTop, b.docIDBottom AS B_docIdBottom, a.*,
STUFF((SELECT ', ' + x.internalID
FROM LookUp AS x
WHERE x.PartNumber=c.PartNumber
FOR XML PATH(''),TYPE).value('.','nvarchar(max)'),1,2,'') AS ConcatInternalID
FROM LookUp a, Links b, LookUp c
WHERE a.docType = 'docTypeMain'
and a.docID = b.docIDTop and b.docIDBottom = c.docID
and c.docType = 'docTypeSub'
;
आप अपने "पुराने क्वेरी" के साथ-साथ यह भी जोड़ सकते हैं couse के
बस का चयन करें
[...CTEs before...]
SELECT A.docId + ' # ' + B.vals AS [DocID # Plant],
A.docID,
A.partNumber,
A.prio,
B.vals AS Plant,
A.partNumber + '#' + A.material + '#' + A.[length] AS Identification,
A.[length],
SUBSTRING(CA.colors,0,LEN(CA.colors)) colors, --substring removes last comma
STUFF((SELECT ', ' + x.internalID
FROM LookUp AS x
WHERE x.PartNumber=A.PartNumber
FOR XML PATH(''),TYPE).value('.','nvarchar(max)'),1,2,'') AS ConcatInternalID
[...FROM...]
आशा मैं अच्छी तरह से समझ में आ इस अंतिम करने के लिए इस जोड़ सकते हैं और यह आपकी मदद कर सकता ...
आपका दो पहेली डेटा सेट किसी भी समानता को साझा करने के लिए प्रकट नहीं होते हैं। यदि, वास्तव में, आप MiscValues तालिका में PartNumber से LookN तालिका में पार्टनंबर में देखने में सक्षम होंगे, मुझे लगता है कि आपकी समस्या स्वयं हल हो जाती है। डेटा को फिर से करें और आपको इसे वहां से समझने में सक्षम होना चाहिए। इसी तरह यदि दस्तावेज़ या MiscValues में लुकअप या लिंक मिलान डॉकिड्स में डॉकिड फ़ील्ड, तो आपकी समस्या हल हो जाती है। यदि यह मामला नहीं है, तो आपके पास कोई संबंधपरक डेटा नहीं है, और यह संभव नहीं है। –
हाय टोनी, यह अच्छा होगा अगर आप सहायक उत्तर दें और उस व्यक्ति को स्वीकार करें जिसने आपको अपनी समस्या का समाधान करने में मदद की, thx! – Shnugo