ahmed_sa Ответов: 1

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


проблема

после добавления поля dbo.trxtypeConfig.TrxArbName для группировки запросов-это проблема повреждения .

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

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

или с другим значением get from every max trxdate per item мне нужно получить TrxArbName .

TrxArbName получить из trxtypeconfig на основе данных существующих в поле trxinvh trxtype

dbo.trxtypeConfig.TrxArbName представляет собой имя транзакции

это связано с trxinvh

каждый заказ должен иметь заголовок в виде одной записи представленной trxinvh и более одной записи в нижнем колонтитуле таблицей trxinvf

сначала добавьте dbo.trxtypeConfig.TrxArbName

SELECT        ISNULL(SUM(CASE WHEN [trxType].trxTypeCode = 1 THEN Quantity ELSE - Quantity END), 0) AS Qty, SUM(CASE WHEN [trxType].trxTypeCode = 1 THEN Quantity  ELSE - Quantity 
                            END) AS Value, dbo.Items.ItemAraName, dbo.ItemGroups.ItemGroupAraName, dbo.ItemSubGroups.ItemSubGroupAraName, 
                         dbo.Items.ItemCode, dbo.Units.UnitAraName, MAX(dbo.TrxInvH.TrxDate) AS LastDate, CASE WHEN Items.StaticDays = 0 THEN 0 ELSE Items.StaticDays END AS StaticDays, 
                         CASE WHEN CASE WHEN Items.StaticDays = 0 THEN 0 ELSE Items.StaticDays END >= DateDiff(Day, GETDATE(), MAX(dbo.TrxInvH.TrxDate)) THEN 1 ELSE 0 END AS ActualStatictemp2, 
                         CASE WHEN DateDiff(DAY, MAX(dbo.TrxInvH.TrxDate), GETDATE()) > CASE WHEN Items.StaticDays = 0 THEN 0 ELSE Items.StaticDays END THEN 1 ELSE 0 END AS ActualStatictemp, DATEDIFF(DAY, 
                         MAX(dbo.TrxInvH.TrxDate), GETDATE()) AS ActualStatic, dbo.Items.ItemLatName, dbo.Units.UnitLatName
FROM            dbo.Units INNER JOIN
                         dbo.Items ON dbo.Units.UnitCode = dbo.Items.UnitCode LEFT OUTER JOIN
                         dbo.Stores INNER JOIN
                         dbo.trxtypeConfig INNER JOIN
                         dbo.TrxInvH ON dbo.trxtypeConfig.BranchCode = dbo.TrxInvH.BranchCode AND dbo.trxtypeConfig.trxtypecode = dbo.TrxInvH.Trxtype INNER JOIN
                         dbo.TrxInvF ON dbo.TrxInvH.BranchCode = dbo.TrxInvF.BranchCode AND dbo.TrxInvH.Trxtype = dbo.TrxInvF.Trxtype AND dbo.TrxInvH.TrxYear = dbo.TrxInvF.TrxYear AND 
                         dbo.TrxInvH.TrxSerial = dbo.TrxInvF.TrxSerial INNER JOIN
                         dbo.trxType ON dbo.trxtypeConfig.TrxTypeID = dbo.trxType.trxTypeCode ON dbo.Stores.StoreCode = dbo.TrxInvF.StoreId AND dbo.Stores.BranchCode = dbo.TrxInvF.BranchCode ON 
                         dbo.Items.ItemCode = dbo.TrxInvF.ItemCode LEFT OUTER JOIN
                         dbo.ItemGroups ON dbo.Items.ItemGroupCode = dbo.ItemGroups.ItemGroupCode LEFT OUTER JOIN
                         dbo.ItemSubGroups ON dbo.Items.ItemGroupCode = dbo.ItemSubGroups.ItemGroupCode AND dbo.Items.ItemSubGroupCode = dbo.ItemSubGroups.ItemSubGroupCode
 WHERE 1 = 1    AND (dbo.TrxInvF.BranchCode in( 1))  and trxinvf.ItemCode='         KFLHS225245' GROUP BY dbo.Items.ItemAraName, dbo.ItemGroups.ItemGroupAraName, dbo.ItemSubGroups.ItemSubGroupAraName, dbo.Items.ItemCode, dbo.Units.UnitAraName, dbo.Items.StaticDays, 
                      dbo.Items.ItemLatName, dbo.Units.UnitLatName
                         HAVING      (ISNULL(SUM(CASE WHEN [trxType].trxTypeCode = 1 THEN Quantity ELSE - Quantity END), 0) <> 0) AND 

                                         
                        (CASE WHEN CASE WHEN Items.StaticDays = 0 THEN 0 ELSE Items.StaticDays END >= DateDiff(Day, GETDATE(), MAX(dbo.TrxInvH.TrxDate)) 
                                              THEN 1 ELSE 0 END = 1)




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

правильный результат-максимальная дата для каждого элемента


так что, как изменить запрос, чтобы показать правильный результат, пожалуйста?

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

After add dbo.trxtypeConfig.TrxArbName as following :

SELECT        ISNULL(SUM(CASE WHEN [trxType].trxTypeCode = 1 THEN Quantity ELSE - Quantity END), 0) AS Qty, SUM(CASE WHEN [trxType].trxTypeCode = 1 THEN Quantity  ELSE - Quantity 
                            END) AS Value, dbo.Items.ItemAraName, dbo.ItemGroups.ItemGroupAraName, dbo.ItemSubGroups.ItemSubGroupAraName, 
                         dbo.Items.ItemCode, dbo.Units.UnitAraName, MAX(dbo.TrxInvH.TrxDate) AS LastDate, CASE WHEN Items.StaticDays = 0 THEN 0 ELSE Items.StaticDays END AS StaticDays, 
                         CASE WHEN CASE WHEN Items.StaticDays = 0 THEN 0 ELSE Items.StaticDays END >= DateDiff(Day, GETDATE(), MAX(dbo.TrxInvH.TrxDate)) THEN 1 ELSE 0 END AS ActualStatictemp2, 
                         CASE WHEN DateDiff(DAY, MAX(dbo.TrxInvH.TrxDate), GETDATE()) > CASE WHEN Items.StaticDays = 0 THEN 0 ELSE Items.StaticDays END THEN 1 ELSE 0 END AS ActualStatictemp, DATEDIFF(DAY, 
                         MAX(dbo.TrxInvH.TrxDate), GETDATE()) AS ActualStatic, dbo.Items.ItemLatName, dbo.Units.UnitLatName, dbo.trxtypeConfig.TrxArbName
FROM            dbo.Units INNER JOIN
                         dbo.Items ON dbo.Units.UnitCode = dbo.Items.UnitCode LEFT OUTER JOIN
                         dbo.Stores INNER JOIN
                         dbo.trxtypeConfig INNER JOIN
                         dbo.TrxInvH ON dbo.trxtypeConfig.BranchCode = dbo.TrxInvH.BranchCode AND dbo.trxtypeConfig.trxtypecode = dbo.TrxInvH.Trxtype INNER JOIN
                         dbo.TrxInvF ON dbo.TrxInvH.BranchCode = dbo.TrxInvF.BranchCode AND dbo.TrxInvH.Trxtype = dbo.TrxInvF.Trxtype AND dbo.TrxInvH.TrxYear = dbo.TrxInvF.TrxYear AND 
                         dbo.TrxInvH.TrxSerial = dbo.TrxInvF.TrxSerial INNER JOIN
                         dbo.trxType ON dbo.trxtypeConfig.TrxTypeID = dbo.trxType.trxTypeCode ON dbo.Stores.StoreCode = dbo.TrxInvF.StoreId AND dbo.Stores.BranchCode = dbo.TrxInvF.BranchCode ON 
                         dbo.Items.ItemCode = dbo.TrxInvF.ItemCode LEFT OUTER JOIN
                         dbo.ItemGroups ON dbo.Items.ItemGroupCode = dbo.ItemGroups.ItemGroupCode LEFT OUTER JOIN
                         dbo.ItemSubGroups ON dbo.Items.ItemGroupCode = dbo.ItemSubGroups.ItemGroupCode AND dbo.Items.ItemSubGroupCode = dbo.ItemSubGroups.ItemSubGroupCode
 WHERE 1 = 1    AND (dbo.TrxInvF.BranchCode in( 1))  and trxinvf.ItemCode='         KFLHS225245' GROUP BY dbo.Items.ItemAraName, dbo.ItemGroups.ItemGroupAraName, dbo.ItemSubGroups.ItemSubGroupAraName, dbo.Items.ItemCode, dbo.Units.UnitAraName, dbo.Items.StaticDays, 
                      dbo.Items.ItemLatName, dbo.Units.UnitLatName,dbo.trxtypeConfig.TrxArbName
                         HAVING      (ISNULL(SUM(CASE WHEN [trxType].trxTypeCode = 1 THEN Quantity ELSE - Quantity END), 0) <> 0) AND 

                                         
                        (CASE WHEN CASE WHEN Items.StaticDays = 0 THEN 0 ELSE Items.StaticDays END >= DateDiff(Day, GETDATE(), MAX(dbo.TrxInvH.TrxDate)) 
                                              THEN 1 ELSE 0 END = 1)

Santosh kumar Pithani

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

1 Ответов

Рейтинг:
2

CHill60

Мы никак не можем помочь вам решить подобную проблему, не увидев некоторых примеров данных. Ваши ожидаемые результаты также были бы невероятно полезны.

Вот несколько техник, которые помогут вам решить вашу собственную проблему.

1. упростите свой запрос! Более читаемый запрос - это более простой в обслуживании запрос. Например у вас есть

CASE WHEN Items.StaticDays = 0 THEN 0 ELSE Items.StaticDays END AS StaticDays,
что имеет точно такой же эффект, как и
Items.StaticDays,
Вы пользуетесь этим повсюду.

2. Будьте последовательны. В некоторых местах вы использовали полную схему таблицы+имя, например MAX(dbo.TrxInvH.TrxDate) а в других случаях вы не включали схему но включали имя в квадратные скобки когда в этом не было необходимости например [trxType].trxTypeCode. Рассмотрите возможность использования более коротких псевдонимов таблиц (или корреляционных имен), например, вместо того, чтобы иметь dbo.ItemSubGroups.ItemSubGroupAraName, в вашем выборе это может быть ISG.ItemsSubGroupAraName - гораздо легче читать, когда вы делаете сложный выбор, как это

3. ознакомьтесь с документацией по используемым функциям SQL, даже если они кажутся простыми. Например, в SUM (Transact-SQL) - SQL Server | Microsoft Docs[^] вы узнаете, что SUM функция игнорирует нулевые значения, поэтому нет необходимости использовать ISNULL также.

4. используйте "пробел" в запросах, чтобы сделать их более удобочитаемыми. Я перестроил ваш запрос, чтобы поместить перевод строки перед каждым типом соединения, и первое, что я заметил, было отсутствие предложений ON для некоторых из них
LEFT OUTER JOIN dbo.Stores S			-- No ON clause, why?
INNER JOIN      dbo.trxtypeConfig TC	-- No ON clause, why?
Затем я заметил ложное предложение ON в середине нигде
ON I.ItemCode = TF.ItemCode -- spurious ON clause!
Быть аккуратным и опрятным-это не только внешний вид! Это может помочь вам определить потенциальные проблемы

5. пока вы находитесь в документации, вы можете узнать о таких вещах, как общие табличные выражения, табличные переменные и временные таблицы (это "временные", а не "временные" - они разные). Вы также можете использовать их, чтобы сделать запросы более удобочитаемыми. Например, вы используете много DateDiff(Day, GETDATE(), MAX(dbo.TrxInvH.TrxDate)) - разве не было бы здорово, если бы вы могли просто ссылаться на это как DiffTrxDate или что-то похожее? Или CASE WHEN TT.trxTypeCode = 1 THEN Quantity ELSE - Quantity END можно было бы просто сослаться на то, что Qty. Которые могли бы быть мостом слишком далеко для вас, только сейчас, хотя.

Теперь перейдем к фактическому решению вашей проблемы …

Приведя вещи в порядок я замечаю что первые два поля в вашем выборе фактически идентичны
SELECT	SUM(CASE WHEN TT.trxTypeCode = 1 THEN Quantity ELSE - Quantity END) AS Qty, 
	SUM(CASE WHEN TT.trxTypeCode = 1 THEN Quantity ELSE - Quantity END) AS Value, 
Это то, что вы имели в виду под "проблемой повреждения". Бессмысленно возвращать одно и то же значение дважды, поэтому, возможно, вы хотели иметь разные данные в каждом из них.

Исправьте проблемы, которые я указал в пункте 4 выше. Я сомневаюсь, что ваш запрос даже успешно разбирается.

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

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