2015-09-21 15 views
5

से पूछताछ क्वेरी का विस्तार करें यह प्रश्न मेरे Previous Question पर आधारित है। मुझे क्वेरी को विस्तारित करने की आवश्यकता है ताकि मैं दो अन्य तालिकाओं को शामिल कर सकूं (किसी अन्य सर्वर इंस्टेंस पर चल रहा हो)।टीएसक्यूएल - क्रॉस लागू और पिवट

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'); 

उत्पादन मैं एक अल्पविराम से अलग स्तंभPARTNUMBER स्तंभ के आधार पर में नए internalID स्तंभ प्रदर्शित करने के लिए की जरूरत के बारे में:

इस Fiddle में मैं उन दो तालिकाओं गयी।

---------------- 
-- OLD Query -- 
---------------- 
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 
) 

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 
FROM CTE_Pivot A 
INNER JOIN CTE_no_nums B 
    ON  A.docID = B.docID 
     AND B.cols = 'Plant' 
CROSS APPLY ( SELECT vals + ',' 
       FROM CTE_no_nums C 
       WHERE cols = 'Color' 
        AND C.docID = A.docID 
       FOR XML PATH('') 
      ) CA(colors) 
      ; 
:

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.* 
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' 
; 

मेरे समस्या उन टुकड़ों को एक साथ डाल करने के लिए इतना है कि मैं InternalID प्राप्त कर सकते हैं नीचे मेरे पुराने क्वेरी में दिखाने के लिए है:

इस क्वेरी कि सही डेटा आउटपुट है

आशा है कि आप मुझे दिखा सकते हैं कि यह कैसे प्राप्त किया जा सकता है। अगर कुछ अस्पष्ट पूछने के लिए स्वतंत्र महसूस होता है। और नहीं, मैं डेटा संरचना का प्रभारी नहीं हूं :-)

धन्यवाद।

+0

आपका दो पहेली डेटा सेट किसी भी समानता को साझा करने के लिए प्रकट नहीं होते हैं। यदि, वास्तव में, आप MiscValues ​​तालिका में PartNumber से LookN तालिका में पार्टनंबर में देखने में सक्षम होंगे, मुझे लगता है कि आपकी समस्या स्वयं हल हो जाती है। डेटा को फिर से करें और आपको इसे वहां से समझने में सक्षम होना चाहिए। इसी तरह यदि दस्तावेज़ या MiscValues ​​में लुकअप या लिंक मिलान डॉकिड्स में डॉकिड फ़ील्ड, तो आपकी समस्या हल हो जाती है। यदि यह मामला नहीं है, तो आपके पास कोई संबंधपरक डेटा नहीं है, और यह संभव नहीं है। –

+0

हाय टोनी, यह अच्छा होगा अगर आप सहायक उत्तर दें और उस व्यक्ति को स्वीकार करें जिसने आपको अपनी समस्या का समाधान करने में मदद की, thx! – Shnugo

उत्तर

2

जुआन रुइज़ डी कास्टिला ने मेरा दिया गया जवाब बढ़ाया और अपनी "लिंक" -टेबल के लिए अपनी आंखें खोली।

यह मेरा अंतिम सुझाव है एक और 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...] 

आशा मैं अच्छी तरह से समझ में आ इस अंतिम करने के लिए इस जोड़ सकते हैं और यह आपकी मदद कर सकता ...

2

@Shnugo जवाब के आधार पर की कोशिश इस unoptimized (अभी तक) जवाब है, मुझे लगता है कि @Shnugo नहीं करता है लिंक तालिका की जाँच करें, क्योंकि आप अपने डेटा जानकारी को बदलने की जरूरत नहीं है:

[...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 X 
    INNER JOIN LINKS Z 
    ON X.DOCID = Z.DOCIDTOP 
    INNER JOIN LOOKUP X2 
    ON X2.DOCID = Z.DOCIDBOTTOM 
    WHERE X2.PartNumber=A.PartNumber 
    FOR XML PATH(''),TYPE).value('.','nvarchar(max)'),1,2,'') AS ConcatInternalID 
[...FROM...] 
+1

लिंक टेबल के लिए अपनी आंखें खोलने के लिए धन्यवाद ... आप सही हैं, कि गायब जानकारी वहां मिलनी है ... मेरा जवाब बदल गया। मेरे लिए एक अपवित्र – Shnugo

संबंधित मुद्दे