Удаление строк данных на основе данных в комбинации из двух столбцов

#sql #sql-server

#sql #sql-сервер

Вопрос:

Приведенный ниже код создает левый блок данных

введите описание изображения здесь

Это дает мне все подмножество, однако мне нужно только увидеть: Для той же комбинации SATNR-VKORG, где ВСЕ Variant_Status равно I2. Если какой-либо из Variant_Status НЕ является I2, тогда не показывайте всю комбинацию SATNR-VKORG. Моим окончательным результатом должны быть только первые две строки в приведенных ниже данных, тогда как все остальные строки не соответствуют требованиям.

Я не могу понять, как это сделать, но я думаю использовать функцию подсчета, такую как правый блок, для объединения SATNR-VKORG и SATNR-VKORG-Variant_Status и подсчета каждой уникальной комбинации. Для одной и той же комбинации SATNR-VKORG, если два счета идентичны, это означает, что display else не отображается. Даже если я не знаю, как это закодировать, кто-нибудь поможет или у вас есть идеи получше?

 SELECT TOP (1000) 
 MARA.MATNR, 
 MARA.SATNR, 
 MARA.ATTYP, 
 MARA.MTART, 
 MARA.MSTAE, 
 MARA.LVORM, 
 MVKE.VMSTA as Variant_Status, 
 MVKE.VTWEG, mvke.VKORG, MVKE2.
 VMSTA as Generic_Status, 
 MVKE2.VTWEG, MVKE2.VKORG, 
 mara.satnr   mvke.vkorg as concated

from [dgSAP_PRD].dbo.MARA AS MARA
JOIN [dgSAP_PRD].dbo.MVKE AS MVKE ON MARA.MATNR = MVKE.MATNR
JOIN [dgSAP_PRD].dbo.MARA AS MARA2 ON MARA.SATNR = MARA2.MATNR
JOIN [dgSAP_PRD].dbo.MVKE AS MVKE2 ON MARA2.MATNR = MVKE2.MATNR

WHERE MARA.MTART != 'ZODE' 
  AND MARA.ATTYP in (02) 
  AND MARA.LVORM = '' 
  AND MVKE2.VTWEG = '34' 
  AND MVKE.VTWEG = '34' 
  AND MVKE.VKORG=MVKE2.VKORG 
  and mvke2.vmsta != 'I2'

ORDER BY MARA.SATNR,MVKE.VKORG,MVKE2.VKORG, MARA.MATNR
  

Комментарии:

1. Это SQL-сервер, а не MySQL.

2. Преобразуйте запрос в CTE. Добавьте выражение like SUM(CASE WHEN Variant_Status = 'I2' THEN 1 ELSE 0 END) OVER (PARTITION BY [SATNR-VKORG]) в список вывода. В основном запросе выберите только те строки, для которых это дополнительное; выражение выше нуля. Или наоборот — суммируйте Variant_Status != 'I2' и выберите строки с нулем. Зависит от цели…

Ответ №1:

 WITH cte AS 
(
SELECT TOP (1000) 
 MARA.MATNR, 
 MARA.SATNR, 
 MARA.ATTYP, 
 MARA.MTART, 
 MARA.MSTAE, 
 MARA.LVORM, 
 MVKE.VMSTA as Variant_Status, 
 MVKE.VTWEG, mvke.VKORG, MVKE2.
 VMSTA as Generic_Status, 
 MVKE2.VTWEG, MVKE2.VKORG, 
 mara.satnr   mvke.vkorg as concated,
 SUM(CASE WHEN Variant_Status <> 'I2' THEN 1 ELSE 0 END) OVER (PARTITION BY SATNR, VKORG) marker 
 
from [dgSAP_PRD].dbo.MARA AS MARA
JOIN [dgSAP_PRD].dbo.MVKE AS MVKE ON MARA.MATNR = MVKE.MATNR
JOIN [dgSAP_PRD].dbo.MARA AS MARA2 ON MARA.SATNR = MARA2.MATNR
JOIN [dgSAP_PRD].dbo.MVKE AS MVKE2 ON MARA2.MATNR = MVKE2.MATNR

WHERE MARA.MTART <> 'ZODE' 
  AND MARA.ATTYP in (02) 
  AND MARA.LVORM = '' 
  AND MVKE2.VTWEG = '34' 
  AND MVKE.VTWEG = '34' 
  AND MVKE.VKORG=MVKE2.VKORG 
  and mvke2.vmsta <> 'I2'
)

SELECT *
FROM cte
WHERE marker = 0
ORDER BY SATNR, VKORG, VKORG, MATNR
  

Комментарии:

1. Спасибо. Эта логика имеет смысл, однако я получаю ошибку с ‘ SUM (Variant_Status ! = ‘I2’) НАД (РАЗДЕЛ ПО SATNR, VKORG) маркер «строка с неправильным синтаксисом рядом с «!», а также РАЗДЕЛ выделяется с ошибкой. Кажется, я не могу понять проблему с этим.

2. Отредактировано @Yundengogo.

3. Привет @Akina, все та же проблема, я использую SQL server mgmt studio версии 15.0 — может ли это быть как-то связано с этим?

4. @Yundengogo Это невозможно — в отредактированном коде нет цитируемого фрагмента кода. Предоставьте полное и измененное сообщение об ошибке. Что ж, я отредактирую еще раз, подождите … готово.

5. Сообщение 209, уровень 16, состояние 1, строка 15 Неоднозначное имя столбца ‘SATNR’. Сообщение 209, уровень 16, состояние 1, строка 15 Неоднозначное имя столбца ‘VKORG’. Сообщение 207, уровень 16, состояние 1, строка 15 Недопустимое имя столбца ‘Variant_Status’. Сообщение 8156, уровень 16, состояние 1, строка 1 Столбец ‘VTWEG’ был указан несколько раз для ‘cte’. @Akina