2016-01-19 3 views
0

Итак, у меня есть эта структура таблицы здесь http://sqlfiddle.com/#!6/5836b (аналогичная) и ниже. Таблица PForecast имела бы прогноз на верхнем уровне (родительском) продукте. Как только я получу список элементов прогноза за определенный период, мне нужно получить детали продукта для ребенка с наивысшим приоритетом (Ppriority) (для этого родительского sku). Также хотел бы перечислить все остальные дочерние sku, объединенные в отдельный столбец (необязательно).MSSql Родительские отношения с ребенком, получить верхний ребенок и присоединиться к другой таблице

create TABLE PForecast (ID INT, sku INT, qty int, entrydate datetime); 

INSERT INTO PForecast (ID, sku, qty, entrydate) 
VALUES(10, 29490, 1, '2016-09-04 00:00:00.000'), 
(19, 112407, 1, '2016-09-04 00:00:00.000'), 
(11, 112407, 1, '2016-11-14 00:00:00.000'), 
(12, 112344, 12, '2016-01-24 00:00:00.000'), 
(13, 112344, 17, '2016-02-05 00:00:00.000'), 
(14, 112344, 11, '2016-06-03 00:00:00.000'), 
(15, 264856, 7, '2016-05-09 00:00:00.000'), 
(16, 26480, 9, '2016-07-18 00:00:00.000'), 
(17, 264856, 4, '2016-09-27 00:00:00.000'), 
(18, 29490, 2, '2016-12-02 00:00:00.000'); 


create TABLE AllProd2 (sku INT, ID INT, descrip varchar(100), dept varchar(100), 
         SubDept varchar(100), class varchar(100), SubClass varchar(100), 
         Vcode INT, PID INT, Ppriority INT, parentFlag VARCHAR(1)); 

INSERT INTO AllProd2 (sku, ID, descrip, dept, SubDept, class, SubClass, Vcode, PID, Ppriority, parentFlag) 
VALUES 
(169243, 21177, '14 DIA PC/RD', 'abc', 'def', 'xyz', 'gty', 0004, 1043419, 1, 'C'), 
(136643, 21394, '14 DIA PC/RD', 'abc', 'def', 'xyz', 'gty', 0004, 1043419, 2, 'C'), 
(112344, 1043419, '14 DIA PC/RD', 'abc', 'def', 'xyz', 'gty', 0004, 1043419, NULL, 'P'), 
(104516, 122, '14 DIA PC/RD', 'abc', 'def', 'xyz', 'gty', 0004, 1043428, 2, 'C'), 
(111508, 130, '14 DIA PC/RD', 'abc', 'def', 'xyz', 'gty', 0004, 1043428, 1, 'C'), 
(112407, 1043428, '14 DIA PC/RD', 'abc', 'def', 'xyz', 'gty', 0004, 1043428, NULL, 'P'), 
(115106, 17043838, '14 DIA PC/RD', 'abc', 'def', 'xyz', 'gty', 0004, 1043428, 3, 'C'), 
(161835, 116050567, '14 DIA PC/RD', 'abc', 'def', 'xyz', 'gty', 0004, 1043428, 4, 'C'), 
(238777, 1198119585, '14 DIA PC/RD', 'abc', 'def', 'xyz', 'gty', 0004, 1043428, 5, 'C'), 
(255210, 2092139762, '14 DIA PC/RD', 'abc', 'def', 'xyz', 'gty', 0004, 1043555, 2, 'C'), 
(264856, 1043555, '14 DIA PC/RD', 'abc', 'def', 'xyz', 'gty', 0004, 1043555, NULL, 'P'), 
(264863, 1043556, '14 DIA PC/RD', 'abc', 'def', 'xyz', 'gty', 0004, 1043555, 1, 'C'), 
(239124, 1995137332, '14 RD', 'abc', 'def', 'xyz', 'gty', 0004, 1043890, 1, 'C'), 
(266473, 1043889, '14 RD', 'abc', 'def', 'xyz', 'gty', 0004, 1043890, 2, 'C'), 
(266480, 1043890, '14 RD', 'abc', 'def', 'xyz', 'gty', 0004, 1043890, NULL, 'P'), 
(26480, 10430, '14 PC/RD', 'abc', 'def', 'xyz', 'gty', 0007, 10430, NULL, 'P'), 
(29490, 14480, '14 PC/RD hkj', 'abc', 'def', 'xyz', 'gty', 0004, 14480, NULL, 'N') 
; 

Было бы лучше, если я могу построить временную таблицу с набором данных, как мне нужно, чтобы получить более подробную информацию и присоединиться к другим таблицам после этого шага.

Любая помощь приветствуется.

+0

Просьба включить пример или желаемые результаты. Непонятно, что именно вы ищете. –

+0

Запрос будет выбирать все элементы в диапазоне дат из таблицы прогноза, как вы можете видеть из моего проекта таблицы, прогноз имеет только родительский ски и никакой дочерний ски. Таким образом, следующим шагом будет получение дочернего sku (для этой родительской записи) из таблицы продуктов и построение нового результирующего набора для подробного прогноза. то есть SKU 26480 имеет 3 записи в таблице прогнозов, мой конечный результат должен быть таким: – Eclipse

+0

Обновленный комментарий: запрос будет выбирать все элементы в диапазоне дат от прогноза, как вы можете видеть в скрипте, прогноз имеет только родительский ски. Следующим шагом является получение дочерней sku (для этой родительской записи) из таблицы prod и создание нового набора результатов для подробного прогноза. то есть SKU 112344 имеет 3 записи в таблице прогноза. Если я смотрю на таблицу продуктов, родительский идентификатор для этого SKU составляет 1043419. Этот запрос должен отображать Ppriority с наивысшим рангом и получить эту целую строку. Таким образом, мой конечный результат должен быть, как этот: SKU: 136643 \t ID: 21394 \t VCode: ParentID: 1043419 \t ParentPriority: 2 \t ParentFlag: – Eclipse

ответ

0

Прочитав ваш комментарий, я думаю, что вы ищете что-то вроде следующего:

DECLARE @startDate DATE = '2016-06-01', @endDate DATE = '2016-12-01' 
SELECT A.*, STUFF((
    SELECT ', ' + CASE WHEN PPriority IS NULL THEN 'P' + CONVERT(NVARCHAR, SKU) ELSE CONVERT(NVARCHAR, SKU) END 
    FROM AllProd2 
    WHERE PID = A.PID 
    AND ISNULL(PPriority, 0) <> A.PPriority 
    ORDER BY CASE WHEN PPriority IS NULL THEN 0 ELSE 1 END, PPriority 
    FOR XML PATH ('')), 1, 2, '') OtherSKU 
-- INTO #tmpResults 
FROM (SELECT SKU 
    FROM PForecast 
    WHERE entrydate >= @startDate 
    AND entrydate <= @endDate 
    GROUP BY SKU) P 
LEFT JOIN AllProd2 A ON P.SKU = (SELECT SKU FROM AllProd2 WHERE ID = A.PID) 
WHERE ISNULL(PPriority, 0) = (SELECT MAX(ISNULL(PPriority, 0)) FROM AllProd2 WHERE PID = A.PID) 

Это дает следующие за указанный диапазон дат:

+--------+------------+--------------+-----+-----+-----+-----+---+---------+------+---+-----------------------------------------+ 
| 26480 |  10430 | 14 PC/RD  | abc | def | xyz | gty | 7 | 10430 | NULL | P | NULL         | 
| 29490 |  14480 | 14 PC/RD hkj | abc | def | xyz | gty | 4 | 14480 | NULL | N | NULL         | 
| 136643 |  21394 | 14 DIA PC/RD | abc | def | xyz | gty | 4 | 1043419 | 2 | C | P112344, 169243       | 
| 238777 | 1198119585 | 14 DIA PC/RD | abc | def | xyz | gty | 4 | 1043428 | 5 | C | P112407, 111508, 104516, 115106, 161835 | 
| 255210 | 2092139762 | 14 DIA PC/RD | abc | def | xyz | gty | 4 | 1043555 | 2 | C | P264856, 264863       | 
+--------+------------+--------------+-----+-----+-----+-----+---+---------+------+---+-----------------------------------------+ 
+0

C Привет ZLK, это очень полезно. То, что я действительно хочу, - все прогнозы должны быть перечислены. В таблице прогнозов есть 5 различных SKU. Все они должны прийти вверх и из таблицы AllProd, я бы хотел, чтобы детали продукта были вытащены. если в прогнозе есть дочерние скины для выбранного элемента, я бы хотел подтянуть только ребенка с наивысшим приоритетом. Надеюсь, я смог прояснить ситуацию. – Eclipse

+0

Я обновил запрос, чтобы дать то, что, я думаю, вы просите. Если у «родителя» нет «детей», он просто отображает родителя. Если у «родителя» есть «дети», он отображает ребенка с самым высоким PPriority. Или вы ищете всех родителей, которые будут отображаться, а также ребенка с наивысшим Ppriority (если таковой существует)? – ZLK

+0

Большое спасибо. Так что это дает мне то, что мне нужно. – Eclipse

Смежные вопросы