Rahul_Pandit Ответов: 1

Как найти повторяющиеся пучки строк для разных групп


Друзья,
У меня есть таблица, которая содержит 4 столбца, как показано ниже.

GRP_KIT_NO	COMPONENT	COMP_TYPE	QTY
PLATE-1_4123	99S31653	PRT	        1
PLATE-1_4123	33125112	PRT	        1
PLATE-1_4123	49DE0006	PRT	        1


Теперь я вставляю одни и те же строки в одну и ту же таблицу с разными Grp_KIt_NO, как

GRP_KIT_NO	COMPONENT	COMP_TYPE	QTY
PLATE-2_4123	        99S31653	       PRT	   1
PLATE-2_4123	        33125112	       PRT	    1
PLATE-2_4123	        49DE0006	       PRT	    1


Поэтому я создал несколько копий одной и той же даты с разными Grp_KIt_NO.

Теперь наш клиент не хочет выставлять счета группам dupliacte, которые содержат одни и те же данные.

Я не могу найти такую группу.

Теперь я приведу пример

предположим, у меня есть вход

GRP_KIT_NO	COMPONENT	COMP_TYPE	QTY
PLATE-1_4123	22              PRT	        1
PLATE-1_4123	33              PRT	        1

PLATE-2_4123	22	        PRT	        1
PLATE-2_4123	33	        PRT	        1

PLATE-3_4123	11	        PRT	        1
PLATE-3_4123	33      	PRT	        1
PLATE-3_4123	22      	PRT	        1

AAA-3_4123	33      	PRT	        1


Поэтому я хочу получить такой вывод

GRP_KIT_NO	COMPONENT	COMP_TYPE	QTY
PLATE-1_4123	22       	PRT	        1
PLATE-1_4123	33              PRT	        1

PLATE-2_4123	22      	PRT	        1
PLATE-2_4123	33       	PRT	        1


Потому что оба grp_kit_no соответствуют точным данным.

Пожалуйста, помогите мне, ребята.

Что я уже пробовал:

Я попробовал ниже запрос, но не так, как ожидалось


WITH A   -- Get a list of unique combinations of Alias and [Record ID]
AS  (
   SELECT Distinct   GRP_KIT_NO, COMPONENT, COMP_TYPE,QTY--,INDEX_NO
    from GROUP_KIT_BOM
)
,   B  -- Get a list of all those Alias values that have more than one [Record ID] associated
AS  (
    SELECT COMPONENT, COMP_TYPE,QTY--,INDEX_NO
    FROM   A  
    GROUP BY
           COMPONENT, COMP_TYPE,QTY--,INDEX_NO
    HAVING COUNT(*) > 1
)
--select * from b order by COMPONENT, COMP_TYPE,QTY
SELECT A.GRP_KIT_NO, A.COMPONENT, A.COMP_TYPE,A.QTY
FROM    A
    JOIN B
        ON  A.COMPONENT = B.COMPONENT AND A.COMP_TYPE=B.COMP_TYPE ANd A.QTY=B.QTY-- AND A.INDEX_NO=B.INDEX_NO
              order by GRP_KIT_NO,COMPONENT, COMP_TYPE,QTY

Tomas Takac

Вы должны рассмотреть возможность хранения данных другим способом, который позволил бы вам легко улавливать повторное использование компонентов.

Rahul_Pandit

Томас,
Спасибо за ответ. Я не могу изменить подход к хранению ценности в качестве требования нашего клиента .
Пожалуйста, подскажите мне, как я могу написать запрос на то же самое, если мой вопрос вам ясен.

Tomas Takac

То, что вы хотите сделать, не тривиально. В основном вам нужно сравнить каждую группу со всеми остальными, чтобы выяснить, совпадают ли они. Я подумаю об этом и, возможно, позже опубликую ответ. Это может потребовать некоторых дополнительных функций, поэтому я рекомендую вам обновить теги вашего вопроса и указать версию SQL Server, которую вы используете.

Rahul_Pandit

обновленный.

Rahul_Pandit

Дорогой Томас,
Пожалуйста, опубликуйте свой ответ. Его очень важная задача для меня и нужно выполнить как можно скорее.

1 Ответов

Рейтинг:
0

Rahul_Pandit

Я сделал это, используя приведенный ниже код..

SELECT DISTINCT
  SUBSTRING(Grp_kit_NO, 0, CHARINDEX('_', Grp_kit_NO)) GRP_KIT_NO,  0 rownum INTO #temp
FROM group_kit_detail
DECLARE @i int = 0
UPDATE #temp
SET @i = rownum = @i + 1

SELECT
  GRP_KIT_NO,
  CONVERT(varchar(max), '') comp,
  0 RW INTO #T1
FROM GROUP_KIT_BOM
WHERE 1 = 2
SELECT
  CONVERT(varchar(max), '') GRP_KIT_NO,
  CONVERT(varchar(max), '') Match_GRP_KIT_NO INTO #Final
FROM GROUP_KIT_BOM
WHERE 1 = 2


DECLARE @RowCounter int = 1
WHILE @RowCounter <= (SELECT
    COUNT(1)
  FROM #temp)
BEGIN
  DECLARE @MasterGroup varchar(50) = ''
  SELECT
    @MasterGroup = GRP_KIT_NO
  FROM #temp
  WHERE rownum = @RowCounter

  SELECT
    GRP_KIT_NO,
    COMPONENT + COMP_TYPE + QTY comp,
    0 Row1 INTO #TInput
  FROM GROUP_KIT_BOM
  WHERE SUBSTRING(Grp_kit_NO, 0, CHARINDEX('_', Grp_kit_NO)) = @MasterGroup
  ORDER BY GRP_KIT_NO, comp
  DECLARE @j int = 0
  UPDATE #TInput
  SET @j = Row1 = @j + 1

  INSERT INTO #T1
    SELECT
      GRP_KIT_NO,
      COMP = STUFF((SELECT
        ',' + COMP
      FROM #TInput A
      WHERE A.GRP_KIT_NO = B.GRP_KIT_NO     
      FOR xml PATH ('')), 1, 1, ''),
      0
    FROM #TInput B
    GROUP BY B.GRP_KIT_NO
    ORDER BY COMP

  DROP TABLE #TInput
  SET @RowCounter = @RowCounter + 1

END

DECLARE @k int = 0
UPDATE #T1
SET @k = RW = @k + 1


DECLARE @Counter int = 1-----------------matching comp

WHILE @Counter <= (SELECT
    COUNT(1)
  FROM #T1)
BEGIN

  DECLARE @Group varchar(50) = ''
  SELECT
    @Group = GRP_KIT_NO
  FROM #T1
  WHERE RW = @Counter

  INSERT INTO #Final
    SELECT DISTINCT
      A.GRP_KIT_NO,
      B.GRP_KIT_NO
    FROM #T1 A,
         #T1 B
    WHERE B.GRP_KIT_NO <> @Group
    AND A.comp = B.comp
    AND A.GRP_KIT_NO <> B.GRP_KIT_NO
    ORDER BY A.GRP_KIT_NO

  SET @Counter = @Counter + 1
END
 
SELECT
  *
FROM #Final
		
DROP TABLE #Final
DROP TABLE #T1
DROP TABLE #TEMP