2016-10-11 5 views
1

поиск по этому сайту, но не отображается ни одна подобная и помогающая нить.SQL «Distinct» и Group By Section

Пример: У меня есть данные, как показано ниже

Col1  Col2 
aaaa  1111 
aaaa  2222 
bbbb  4444 
bbbb  3333 

Как я могу запросить, чтобы иметь таблицу, как показано ниже?

Col1  Col2 
aaaa  1111 
      2222 
bbbb  4444 
      3333 

Мой текущий запрос для проверки этой цели

SELECT Col1,Col2 FROM msaEPGerror 
FROM Table1 
GROUP BY Col1,Col2 

Пробовал используя различные и группу мимо, но он по-прежнему показывать другие данные, а также. Да, мой дБ содержал более ста тысяч линий. Возможно ли это? Я просто пытаюсь удачи с тех пор, как ранее занимался дизайном, используя Report Builder, но теперь пытаюсь перенести его в SQL.

Благодаря

+1

Объясните свой ожидаемый результат больше. в Col1 есть NULL? где вы ожидаете NULL, потому что Col2, похоже, не сортируется. –

+0

SQL не может иметь тот же дисплей, что и в построителе отчетов, где ячейки объединены. – qxg

+0

Попробуйте это на прикладном уровне –

ответ

2

Используя заказ на col2 ниже запрос будет работать:

select case rank when 1 then col1 else '' end as col1, col2 
from (select col1,col2, 
     rank() over (partition by col1 order by col2) as rank 
    from table1) tab; 
+0

Проблема заключается в том, что ожидаемый результат запроса не упорядочен col2 - вы можете видеть, что для «aaaa» есть значение «1111» в качестве значения, но для bbbb есть «4444» не «3333» –

+0

Привет @Gaurav благодарит за ваш help, я использую именно ваш запрос, результат по-прежнему показывает одинаковые данные в столбце1 ... Точнее, col1 - дата, col2 - люди .. Мне нужно знать, кто сегодня работает, скажем 10people, мне нужно отображать только одну дату (которая сегодня) и список 10people, но мой запрос все еще показывает 10same дата и 10 человек, возможно ли это? – Sap1

+0

@ Sap1, возможно, ваши даты также показывают компонент времени, из-за которого они обрабатываются как различные значения в разделе partition. Попробуйте разделить по порядку trunc (col1) по col2. –

2

Используйте следующий запрос, и он будет возвращать одно значение для конкретного столбца:

SELECT CASE WHEN t.id = (SELECT TOP 1 t2.id FROM Table t2 
WHERE t2.Col1 = t.Col1 
GROUP BY t2.Col1) THEN t.Col1 
ELSE 
'' 
END AS Col1, t.Col2 
FROM Table t 

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

2

Прежде всего: вы не хотите использовать GROUP BY, потому что это для объединения ваших данных, например, для каждой строки результата только для col1.

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

Что вы действительно хотите сделать, это подавить повторяющиеся значения при отображении ваших данных. Здесь вы должны выбирать: либо сделать это в своем графическом интерфейсе (в программе, которую вы пишете, либо в движке отчета), что было бы наиболее распространенным способом сделать это. Или используйте SQL для просмотра предыдущей записи. Функция для этого - LAG.

select 
    col1, 
    case when t.col1 = lag(t.col1) over (order by t.col1, t.col2) then null else col1 end 
    as col2 
from table1 t 
order by t.col1, t.col2; 
+0

ваш ответ и объяснение были превосходны, функция LAG действительно меня подводит к тому, что я ищу ... да, я знаю, что я должен применять это для механизма отчетов, но, похоже, вы сделали это яснее, и я думаю, что смогу достичь своей цели это ... спасибо! спасибо всем за помощь! :) – Sap1

Смежные вопросы