views:

19

answers:

1

The code below explains best what I'm trying to accomplish. I know that I can use a cursor or other looping routine to loop through the records to find the duplicates and create my notes records based on what is found. I'm trying to avoid that, unless there's no better option.

DROP TABLE #orig
DROP TABLE #parts
DROP TABLE #part_notes

CREATE TABLE #orig(partnum VARCHAR(20), notes VARCHAR(100));
INSERT INTO #orig VALUES ('A123', 'To be used on Hyster models only')
INSERT INTO #orig VALUES ('A123', 'Right Hand model only')
INSERT INTO #orig VALUES ('A125', 'Not to be used by Jerry')
INSERT INTO #orig VALUES ('A125', NULL)
INSERT INTO #orig VALUES ('A125', 'asdfasdlfj;lsdf')
INSERT INTO #orig VALUES ('A128', 'David test')
INSERT INTO #orig VALUES ('A129', 'Fake part')

SELECT COUNT(*) FROM #orig

-- SHOW ME UNIQUE PARTS, MY PARTS TABLE SHOULD BE UNIQUE!
SELECT DISTINCT partnum FROM #orig


CREATE TABLE #parts(id INT IDENTITY(1,1), partnum VARCHAR(20));
INSERT INTO #parts
SELECT DISTINCT partnum FROM #orig

SELECT * FROM #parts

CREATE TABLE #part_notes(id INT IDENTITY(1,1), part_id INT, line_number INT, notes VARCHAR(100));
/*
    HOW DO I AT THIS POINT POPULATE the #part_notes table so that it looks like this:
    (note: any NULL or empty note strings should be ignored)

    id  part_id line_number notes
    1   1       1           To be used on Hyster models only    
    2   1       2           Right Hand model only
    3   2       1           Not to be used by Jerry
    4   2       2           asdfasdlfj;lsdf
    6   3       1           David test
    7   4       1           Fake part

*/
+1  A: 

The below just arbitrarily chooses line_numbers as there doesn't seem to be anything suitable to order by in the data.

SELECT   p.id part_id,
         p.partnum   ,
         ROW_NUMBER() over (partition BY p.id ORDER BY (SELECT 0)) line_number,
         notes
FROM     #parts p
         JOIN #orig o
         ON       o.partnum=p.partnum
WHERE    notes   IS NOT NULL
AND      notes            <> ''
ORDER BY part_id
Martin Smith
This works for me perfectly. Since there's no order to the notes currently, I'm not concerned with the order that they're added. Thanks!
dtaylo04
Martin - is there a way to run this script a 2nd time and have the line_number start at the current line_number + 1 for that part_id?
dtaylo04
Answered my own question: `ROW_NUMBER() over (partition BY p.id ORDER BY (SELECT 0)) + ISNULL(MAX(n.line_number),0) line_number`and include a left outer join: `LEFT OUTER JOIN #part_notes n on p.id = n.part_id` you also need to add a `Group By` clause.
dtaylo04