|
|
|
|
#1 |
|
Участник
|
Цитата:
В нашей компании складской учет в Аксапте ведется по партиям. Если какая-то номенклатура учитывается по серийным номерам, то комбинация "серийный номер + номер партии" должна быть уникальна по каждому из номеров в отдельности, т.е. один и тот же серийный номер не может встречаться (комбинироваться) с разными номерами партий - только с одной. Так должно быть. И в подавляющем большинстве случаев так оно и есть. Но, однако, не абсолютно во всех случаях. По каким-то причинам образовались дублирования: одному серийнику соответствуют более, чем одна партия. Причины сейчас выясняются.
по-моему совсем не очевидно, что комбинация "серийный номер + номер партии" должна быть уникальна..., тк номер партии не уникальный и серийный номер тоже. Последний раз редактировалось ice; 22.11.2007 в 13:47. |
|
|
|
|
#2 |
|
Moderator
|
2 Владимир Максимов
Владимир, конечно же есть такая фича COUNT(DISTINCT ) и в Оракле. Не могу сказать, что она в данном случае сильно спасает, так как номера партий все равно нужно откуда-то доставать. Обычно подобные запросы я пишу с использованием фразы WITH, и тогда повторяющийся фрагмент (который "ЕЩЕ РАЗ увы") выносится за "скобки" основного запроса и прописывается один раз перед ним: Код: WITH Tmp01 AS
(SELECT InventSerialId, InventBatchId FROM InventDim
INNER JOIN InventTrans ON InventDim.InventDimId = InventTrans.InventDimId
WHERE InventSerialId <> CHR(2) --// CHR(2) - аксаптовский null для Oracle
GROUP BY InventSerialId, InventBatchId
) --// уникальные сочетания серийника и партии, встречающиеся в InventTrans
SELECT
Tmp01.InventSerialId AS "Серийный номер",
Tmp02.Cnt AS "Кол-во повторений", --// ...этого серийника для разных номеров партий
Tmp01.InventBatchId AS "Номер партии"
FROM
Tmp01
INNER JOIN
(SELECT InventSerialId, COUNT(*) AS Cnt FROM Tmp01
GROUP BY InventSerialId
HAVING COUNT(*) <> 1
) Tmp02 --// уникальные серийники из уникальных сочетаний серийник+партия
ON Tmp01.InventSerialId = Tmp02.InventSerialId
ORDER BY Tmp01.InventSerialId, Tmp01.InventBatchIdНо вообще речь-то не обо всем об этом. Виноват, если показалось по-другому, но я не ставил целью обсуждать способ нахождения задвоений (и максимально его конкретно оптимизировать - и в SQL, и в Аксе). Это просто пример о чем-нибудь.Цель другая - показать, как довольно сложный запрос SQL можно достаточно прозрачно реализовать в Аксапте серией последовательных простых select'ов на основе временных таблиц, которые не нужно готовить заранее! А также показать, как в рамках одного метода (джоба) можно фактически реализовать вычисления типа SELEСT * FROM (SELEСT * FROM (SELEСT * FROM (SELEСT * FROM (SELEСT * FROM (SELEСT * FROM... ))))) Нельзя в лоб сделать в аксаптовском select'е одновременно группировку и сортировку (причем, убывающую)? Пожалуйста, разделим процесс на 2 запроса. А если что-то посложнее, то и на 3, и на 4, и на более. |
|
|