2015-02-17 1 views
0

Таблица 1Sql Server получать дубликаты строк по столбцам

ColumnA - Column B Column C 

111   Null  AA 
111   Null  BB 
222   Null  CC 
333   555,222  DD 
444   Null  EE 
666   777   FF 
888   777   GG 

мне нужно напечатать все строки

, где число в колонке А больше, чем в два раза где число в колонке А совпадает с числом в колонке b и возникновении более одного раза (строка 3 на колонке A соответствует четвертой строке столбца b)

Ожидаемый результат

111   Null  AA 
111   Null  BB 
222   Null  CC 
333   555,222  DD 
+1

Если вы размещаете ваши попытки это проще исправить, чем переписать его с нуля ... –

ответ

1

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

Выберите отчетливые Колумны, Колонок B от Table1

0

ОБРАЗЦА ТАБЛИЦА

CREATE TABLE #TEMP(COLUMNA INT,COLUMNB VARCHAR(30),COLUMNC VARCHAR(30)) 

INSERT INTO #TEMP 
SELECT 111,   Null,  'AA' 
UNION ALL 
SELECT 111,   Null,  'BB' 
UNION ALL 
SELECT 222,   Null,  'CC' 
UNION ALL 
SELECT 333,   '555,222',  'DD' 
UNION ALL 
SELECT 444,   Null,  'EE' 
UNION ALL 
SELECT 666,   '777',   'FF' 
UNION ALL 
SELECT 888,   '777',   'GG' 

QUERY

Я написал логику внутри запроса

;WITH CTE AS 
(
    -- Get the CSV as rows and count the occurance of ColumnA 
    SELECT COLUMNA,LTRIM(RTRIM(Split.a.value('.', 'VARCHAR(100)'))) 'COLUMNB',COLUMNC, 
    COUNT(COLUMNA) OVER(PARTITION BY COLUMNA) CNT 
    FROM 
    (
     -- Select the values to convert into rows from CSV 
     SELECT COLUMNA, 
     CAST ('<M>' + REPLACE(ISNULL(COLUMNB,''), ',', '</M><M>') + '</M>' AS XML) AS Data, 
     COLUMNC 
     FROM #TEMP  
    ) AS A 
    CROSS APPLY Data.nodes ('/M') AS Split(a) 
) 
-- Find the rows where number of each unique item in ColumnA > 1 
-- and ColumnA element exists in ColumnB 
SELECT DISTINCT T.* 
FROM CTE C 
JOIN #TEMP T ON C.COLUMNA=T.COLUMNA 
WHERE CNT > 1 
OR C.COLUMNA IN (SELECT DISTINCT COLUMNB FROM CTE) 
  • Click here для просмотра результат

РЕЗУЛЬТАТ

enter image description here

EDIT

Если вы хотите, чтобы получить записи, когда только оба условия удовлетворяют, используйте AND вместо OR в последней строке, т.е.

AND C.COLUMNA IN (SELECT DISTINCT COLUMNB FROM CTE)