Member 14778402 Ответов: 2

Подсчет с условиями в другой таблице и присоединение записей к третьей таблице


Я подсчитываю записи для конкретного значения проекта (cprj) из таблицы [MatchingRowsOutput-CI-BOM-ProjectCumulative] и перекрестно ссылаюсь на число со значением [DWRowCount] в другой таблице [OrderEntry] для того же проекта "cprj".

Если эти значения совпадают, я хотел бы взять все записи для этого проекта (cprj) из таблицы [MatchingRowsOutput-CI-BOM-ProjectCumulative] и вывести их в другую таблицу под названием [CI-BM-CPRJ-Transfer].

Я перепробовал много различных методов, пытаясь использовать предложение CASE, где предложение, имеющее предложение, но ни один из них не сработал.

Код, вставленный ниже, является самым успешным, которого я могу достичь, возвращая 0 затронутых строк. Я точно знаю, что для TEK#7000 cprj должен быть возврат 26 строк.

Кроме того, после того как я вытащил записи из таблицы [MatchingRowsOutput-CI-BOM-ProjectCumulative] и поместил их в таблицу [CI-BM-CPRJ-Transfer], я хотел бы удалить записи, которые были использованы для ссылки

из таблицы [OrderEntry]. Я еще не пытался закодировать эту часть в приведенном ниже коде.

Любая помощь очень ценится.


Вот примеры 2-х таблиц с этой информацией.

[OrderEntry] Table
ID	cprj		TotalRowCount		DWRowCount
1	TEK#7000	80			26
2	TEK#4444	50			30
3	TEK#88888	120			24
4	TEK#4700	37			13
5	TEK#99999	53			42


[MatchingRowsOutput-CI-BOM-ProjectCumulative] table
ID	cprj		item		PartNumber		SWITEM	QTY	rutm	
196	TEK#7000	A23-3171-X	A23-3171\2583		1.2	2	NULL	
197	TEK#5555	N02-0846-X	N02-0846A5\59\2583	2	1	NULL	
198	TEK#7000	N02-0846-X	N02-0846A5\59\2583	2	1	NULL	
199	TEK#5555	A23-1354-X	A23-1354\2583		2.3	2	NULL	
200	TEK#7000	A23-1354-X	A23-1354\2583		2.3	2	NULL	
201	TEK#7000	B11-0304-X	B11-0304\25		2.4	2	NULL	
202	TEK#7000	B11-0304-X	B11-0304\25		1.4	2	NULL	
203	TEK#5555	B11-0304-X	B11-0304\25		2.4	2	NULL	
204	TEK#5555	B11-0304-X	B11-0304\25		1.4	2	NULL	
205	TEK#5555	B11-0305-X	B11-0305\59		1.5	2	NULL	
206	TEK#5555	B11-0305-X	B11-0305\59		2.5	2	NULL	
207	TEK#7000	B11-0305-X	B11-0305\59		1.5	2	NULL


Я не мог показать все столбцы для этой 2-й таблицы.

[CI-BM-CPRJ-Transfer] - это новая таблица, в которую будут записаны результаты.

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

Insertinto SSIS.dbo.[CI-BM-CPRJ-Transfer](cprj, item, PartNumber, SWITEM, QTY, rutm, trid, mitm, pono, sitm, opol, qana, scpf, cwar, opno, cpha, exin, itlu, ssta, dsca, dscb, dscd, suno, ctyo, eitm)

SELECT 
    PartList.[cprj],
    XMLLines.[item],
    XMLLines.[PartNumber],
    XMLLines.[SWITEM],
    XMLLines.[QTY],
    XMLLines.[rutm],
    XMLLines.[trid],
    XMLLines.[mitm],
    XMLLines.[pono],
    XMLLines.[sitm],
    XMLLines.[opol],
    XMLLines.[qana],
    XMLLines.[scpf],
    XMLLines.[cwar],
    XMLLines.[opno],
    XMLLines.[cpha],
    XMLLines.[exin],
    XMLLines.[itlu],
    XMLLines.[ssta],
    XMLLines.[dsca],
    XMLLines.[dscb],
    XMLLines.[dscd],
    XMLLines.[suno],
    XMLLines.[ctyo],
    XMLLines.[eitm]
FROM 
    OrderEntry.dbo.OrderEntry as PartList

INNERJOIN
SSIS.dbo.[MatchingRowsOutput-CI-BOM-ProjectCumulative]AS XMLLines ON 
XMLLines.cprj = PartList.cprj

    (SELECT cprj FROM SSIS.dbo.[MatchingRowsOutput-CI-BOM-ProjectCumulative])GroupBy XMLLines.cprj, PartList.DWRowCount, XMLLines.[item], XMLLines.[PartNumber], XMLLines.[SWITEM], XMLLines.[QTY], XMLLines.[rutm], XMLLines.[trid], XMLLines.[mitm], XMLLines.[pono], XMLLines.[sitm],
XMLLines.[opol], XMLLines.[qana], XMLLines.[scpf], XMLLines.[cwar], XMLLines.[opno], XMLLines.[cpha], XMLLines.[exin], XMLLines.[itlu], XMLLines.[ssta], XMLLines.[dsca], XMLLines.[dscb], XMLLines.[dscd],
XMLLines.[suno], XMLLines.[ctyo], XMLLines.[eitm], PartList.[cprj]


Having count(XMLLines.cprj)= PartList.DWRowCount

2 Ответов

Рейтинг:
13

MarcusCole6833

Грубое руководство по моему решению

Я бы создал табличную переменную как показано в решении 1 то есть представитель столбцов в таблице перевода, которая заполняется присоединиться к порядок въезда и накопительной.

Введите данные в temp

вставить в @temp (необходимы столбцы)
выберите (необходимые столбцы)
от order_enter
внутреннее соединение кумулятивное


Заполнения Передачи

вставка в передачу (необходимы столбцы )
выберите (необходимые столбцы )
от @temp

Удаление

удалить из оригинального

orderentry oe
внутреннее соединение @temp t on t.cprj = oe.cprj

Удаление с помощью примера соединения

Как удалить с помощью внутреннего соединения с SQL Server? - переполнение стека[^]


Member 14778402

Привет, Маркус, Спасибо за помощь. Единственное условие, которое действительно уместно, состоит в том, что количество конкретного cprj из кумулятивной таблицы должно равняться значению в столбце DWRowCount в таблице ввода заказа для того же cprj. Это определяет записи cprj для извлечения из накопительной таблицы в таблицу переноса. Не знаю, как закодировать это условие. Счетчик возвращает нулевое значение, как уже упоминалось выше.
Видите ли, если количество из кумулятивной таблицы для cprj и значение DWRowCount не равны, мне вообще не нужны записи.

MarcusCole6833

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

Member 14778402

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


объявить @COUNTER INT
выберите @COUNTER = count(cprj)
от SSIS.dbo.[MatchingRowsOutput-CI-BOM-ProjectCumulative]
--где
--XMLLines.cprj=OrderEntry.DBO.OrderEntry.cprj


Объявить таблицу @tmp (
ИДЕНТИФИКАТОР ИНТ,
[DWRowCount] [int] NULL,
[CumuCount] [int] NULL,
[cprj] [varchar](500) NULL,
[item] [varchar](500) NULL,
[PartNumber] [varchar](500) NULL,
[SWITEM] [varchar](500) NULL,
[Кол-во] [varchar](500) NULL,
[rutm] [varchar](500) NULL,
[trid] [varchar](500) NULL,
[mitm] [varchar](500) NULL,
[pono] [varchar](500) NULL,
[sitm] [varchar](500) NULL,
[opol] [varchar](500) NULL,
[Кана] [варчар](500) ноль,
[scpf] [varchar](500) NULL,
[cwar] [varchar](500) NULL,
[opno] [varchar](500) NULL,
[cpha] [varchar](500) NULL,
[exin] [varchar](500) NULL,
[itlu] [varchar](500) NULL,
[ssta] [varchar](500) NULL,
[dsca] [varchar](500) NULL,
[dscb] [varchar](500) NULL,
[dscd] [varchar](500) NULL,
[suno] [varchar](500) NULL,
[ctyo] [varchar](500) NULL,
[eitm] [varchar](500) NULL)

Вставить @ТМП

(DWRowCount, CumuCount, cprj, номенклатуры, артикулу, SWITEM, кол-во, rutm, трид, миом, поно, sitm, Ополье, Кане, ГНПФ, cwar, opno, cpha, компанией Exin, itlu, сста оценке DSCA, dscb, dscd, Суне, ctyo, eitm)


ВЫБИРАТЬ
Список участников.DWRowCount,
CumuCount = @счетчик,
XMLLines.[cprj],
XMLLines.[пункт],
XMLLines.[Партнерский номер],
XMLLines.[SWITEM],
XMLLines.[КОЛИЧЕСТВО],
XMLLines.[рутм],
XMLLines.[Трид],
XMLLines.[атаки MITM],
XMLLines.[поно],
XMLLines.[ситм],
XMLLines.[опол],
XMLLines.[Кана],
XMLLines.[ГНПФ],
XMLLines.[cwar],
XMLLines.[ОПНО],
XMLLines.[cpha],
XMLLines.[эксин],
XMLLines.[итлу],
XMLLines.[сста],
XMLLines.[оценке DSCA],
XMLLines.[dscb],
XMLLines.[dscd],
XMLLines.[Суно],
XMLLines.[ctyo],
XMLLines.[eitm]

ОТ
Служб SSIS.ДБО.[MatchingRowsOutput-CI-BOM-ProjectCumulative] как XMLLines

внутреннее соединение
OrderEntry.ДБО.OrderEntry как список деталей на
(XMLLines.cprj) = PartList.cprj

с объявленной переменной @Counter она возвращает только 156 count, поэтому она подсчитывает все записи в столбце cprj. Мне нужно, чтобы он подсчитывал только те общие записи в столбце кумулятивной таблицы для конкретного проекта, то есть TEK#7000 имеет только 26 записей, TEK#4700 имеет 13 записей и так далее, но возвращаемое значение равно 156, которое представляет все записи для всей таблицы.

В новой таблице @tmp есть 2 столбца, созданные DWRowCount (из таблицы ввода заказа) и CumuCount, который был только что вычислен с условием.

Затем я могу, наконец, создать финальную таблицу, удалив все в исключении, где DWRowCount и CumuCount равны.

Как только эта таблица будет создана, я хотел бы добраться до таблицы OrderEntry и удалить записи, которые были сохранены в окончательной таблице переноса.

Спасибо за вашу помощь!

MarcusCole6833

является ли qnty из кумулятивного числа, которое вы хотите считать группой, а затем сравнить со списком заказов?

Member 14778402

Нет, все это основано на количестве строк и cprj #. Если вы посмотрите на таблицы, которые я предоставил в верхней части QTY, то их нет в таблице orderentry. Эта таблица ввода заказов-это просто ссылка, которую мы используем на то, сколько строк для конкретного проекта отправляется через наш внутренний процесс, и я просто сравниваю количество строк на основе каждого проекта из нашей кумулятивной таблицы вещей, находящихся в qeue. Если они равны я получаю qeue для потока на основе каждого проекта отправляя таблицу переноса через

Member 14778402

Возможно, я неверно истолковал ваше заявление в моем другом ответе. Я хочу сгруппировать на основе того же количества записей из кумулятивной таблицы до значения в столбце DWRowCount таблицы OrderEntry, имеющего тот же cprj. Не уверен, что это то, что вы имели в виду.

MarcusCole6833

объявить @Т таблица а (ID int удостоверение(1,1), cprojID тип varchar(20), countC инт счет инт)
выберите distinct cproj , 0, 0
от кумулятивного
внутренняя запись заказа соединения на cproj = cproj

отсюда вы можете зацикливаться на итогах

обновление t
установить счетчик =

TotalRowCount	or DWRowCount

внутренняя запись заказа соединения на t.cproj = oe.cproj

затем используйте цикл для просмотра каждого идентификатора croj и подсчета каждого идентификатора в накопительной таблице

из этой временной таблицы, где countc == count E, выполните оставшуюся часть логики вставки и удаления

Member 14778402

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

MarcusCole6833

это не самая простая вещь, чтобы сделать, это получить заданное значение в одной таблице, которое кумулятивно хранится в другой таблице, а затем запустить логику против этого. Разве у вас нет более старшего разработчика, помогающего вам?

Member 14778402

No one helping at this time. We are developing a company roll-out for automation of our products from a design point using driveworks for the models and drawings at the front end, and then using sql to handle the backend to manipulate all the data and information flow that would feed manufacturing and in house process flows. At this time, we have developed most of the backend but have put a little more thought on how to control with checks. This is one of the controls, because We want the transfer table to be developed in this particualr project, to accumulate all the projects (xml lines) it has been fed, and check it against what has been fed to us and then push this transfer table to an http post which will feed our configurator router. I want to accumulate the data before sending because I dont want to be constantly pinging the router. Also, if there are problems with certain projects that have been fed to the backend they will be errored out and handled manually. So the count in the cumulative project would not be the same as the orderentry thus we know not to push this data thru. Thats out intention with this query I have been trying to figure out. Its one piece of our puzzle.

MarcusCole6833

значения цикла ок вот с чего мы начинаем

мы имеем различные значения во временной таблице с добавочным идентификатором


поэтому мы выбираем минимальное и максимальное значения как счетчики для цикла

в цикле нам нужен идентификатор детали и результат, чтобы получить суммированные значения hte

ниже приведен синий проинт для этого

Я отложил кодовое решение, так как думал, что это домашнее задание, и именно поэтому я, возможно, был немного непрозрачен со своими ответами, но, читая ваш последний ответ, Вы делаете что-то похожее на меня ежедневно

выберите @min - min(id), @max = max(id) из @t
объявить @cproj varchar(20)
объявить @sum int = 0
в то время как @min <= @max
начать

выберите @cproj = cprof из @t, где id = @min

выберите @сумма = сумма(количетвом) от сравнительных где cproj = @cproj

обновление @t настройте аккаунт = @сумма где ID = @мин
set @min = @min + 1

конец

Member 14778402

Привет, Маркус, Спасибо за всю вашу помощь и предложения. Мне действительно удалось запустить его, дав необходимые результаты. Я создал таблицу @tmp и вставил в нее с помощью внутреннего соединения столбцы из кумулятивной таблицы и таблицы ввода заказов (DWRowCount из oe и count (cprj) как Cumucount). Граф раньше не работал, так как я не знал о группе по пункту.
Затем я внутренне присоединил эту таблицу @tmp и кумулятивную таблицу к окончательной таблице переноса, вызывая все остальные столбцы, которые мне требовались из кумулятивной таблицы.
Затем удалил записи в таблице переноса, где DWRowCount<>CumuCount. Это дает результаты, которые я буду отправлять на HTTP-почту.
Наконец, я сделал удаление с внутренним соединением, которое вы рекомендовали удалить записи из таблицы orderentry против окончательной таблицы переноса, где DWRowCount = CumuCount из их соответствующих таблиц.

Программирование может быть неэффективным, так как я мог бы понять, как его кодировать, но логика есть, и результаты-это то, что мы ищем. После нашего доказательства концепции для всего проекта у нас будет профессиональный SQL-программист, который оценит наши запросы и, возможно, улучшит их.

Еще раз спасибо за вашу помощь. Это было очень ценно.

MarcusCole6833

не могли бы вы добавить мое предложение в качестве ответа?

Рейтинг:
0

Maciej Los

Это довольно легко получить подсчет предметов с помощью COUNT (Transact-SQL)[^]

DECLARE @tmp TABLE (ID	INT, cprj VARCHAR(30), item VARCHAR(30), PartNumber VARCHAR(30), SWITEM VARCHAR(10), QTY INT)

INSERT INTO @tmp (ID, cprj, item, PartNumber, SWITEM, QTY)
VALUES(196, 'TEK#7000', 'A23-3171-X', 'A23-3171\2583', '1.2', 2),
(197, 'TEK#5555', 'N02-0846-X', 'N02-0846A5\59\2583', '2', 1),
(198, 'TEK#7000', 'N02-0846-X', 'N02-0846A5\59\2583', '2', 1),
(199, 'TEK#5555', 'A23-1354-X', 'A23-1354\2583', '2.3', 2),
(200, 'TEK#7000', 'A23-1354-X', 'A23-1354\2583', '2.3', 2),
(201, 'TEK#7000', 'B11-0304-X', 'B11-0304\25', '2.4', 2),
(202, 'TEK#7000', 'B11-0304-X', 'B11-0304\25', '1.4', 2),
(203, 'TEK#5555', 'B11-0304-X', 'B11-0304\25', '2.4', 2),
(204, 'TEK#5555', 'B11-0304-X', 'B11-0304\25', '1.4', 2),
(205, 'TEK#5555', 'B11-0305-X', 'B11-0305\59', '1.5', 2),
(206, 'TEK#5555', 'B11-0305-X', 'B11-0305\59', '2.5', 2),
(207, 'TEK#7000', 'B11-0305-X', 'B11-0305\59', '1.5', 2)

SELECT cprj, COUNT(cprj) CountOfCprj
FROM @tmp
GROUP BY cprj


Основываясь на данных, которые были опубликованы, результат таков:
cprj	CountOfCprj
TEK#5555	6
TEK#7000	6


Member 14778402

Спасибо Мацей. Моя большая проблема заключается в использовании этого счетчика в качестве условия для извлечения записей из таблицы [MatchingRowsOutput-CI-BOM-ProjectCumulative] с условием, что счетчик соответствует значению в столбце DWRowCount таблицы [OrderEntry] и что значение cprj в обеих таблицах совпадает. Затем записи извлекаются в новую таблицу [CI-BM-CPRJ-Transfer].
Наконец, как только происходит извлечение, я должен удалить записи из таблицы [OrderEntry] на основе тех же условий выше, где количество равно и cprj равны.
Я продолжаю получать "0 строк, возвращенных" из моего кода.
Мой последний код выглядит следующим образом:

объявить @COUNTER INT
выберите @COUNTER = count(cprj)
от SSIS.dbo.[MatchingRowsOutput-CI-BOM-ProjectCumulative]

Вставьте в SSIS.dbo.[CI-BM-CPRJ-передача]

(cprj, номенклатуры, артикулу, SWITEM, кол-во, rutm, трид, миом, поно, sitm, Ополье, Кане, ГНПФ, cwar, opno, cpha, компанией Exin, itlu, сста оценке DSCA, dscb, dscd, Суне, ctyo, eitm)


ВЫБИРАТЬ
XMLLines.[cprj],
XMLLines.[пункт],
XMLLines.[Партнерский номер],
XMLLines.[SWITEM],
XMLLines.[КОЛИЧЕСТВО],
XMLLines.[рутм],
XMLLines.[Трид],
XMLLines.[атаки MITM],
XMLLines.[поно],
XMLLines.[ситм],
XMLLines.[опол],
XMLLines.[Кана],
XMLLines.[ГНПФ],
XMLLines.[cwar],
XMLLines.[ОПНО],
XMLLines.[cpha],
XMLLines.[эксин],
XMLLines.[итлу],
XMLLines.[сста],
XMLLines.[оценке DSCA],
XMLLines.[dscb],
XMLLines.[dscd],
XMLLines.[Суно],
XMLLines.[ctyo],
XMLLines.[eitm]


ОТ
Служб SSIS.ДБО.[MatchingRowsOutput-CI-BOM-ProjectCumulative] как XMLLines

внутреннее соединение
OrderEntry.ДБО.OrderEntry как список деталей на
(XMLLines.cprj) = PartList.cprj

Где @COUNTER = PartList.DWRowCount