2016-07-05 1 views
0

Использование SQL Server 2000 - У меня есть старая база данных, и она не нормализована.Группа не нормированных столбцов

Он имеет кучу столбцов, как

memId 
c1 
c2 
c3 
c4 
c5 

Эти столбцы содержат номер сэмпла здесь,

123 
10 
20 
0 
40 
0 

123 
0 
20 
0 
40 
5 

То, что я хочу, чтобы извлечь данные, сгруппированные по memId и имя столбца, как этот

будет выпускаться как

memId col total 
123 c1 10 
123 c2 40 
123 c4 80 
123 c5 5 

где число представляет собой сумму для группы

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

+0

использовать стержень .....? –

+0

Его SQL 2000 db и univot, похоже, не поддерживается –

+6

Люди по-прежнему используют SQL2000 ?! Мои соболезнования ... – DavidG

ответ

1

Похоже, вы хотите получить unpivot свои результаты. Один из вариантов для вашей базы данных будет union all:

select memId, 'c1' as col, sum(c1) from yourtable group by memId, col 
union all 
select memId, 'c2' as col, sum(c2) from yourtable group by memId, col 
union all 
select memId, 'c3' as col, sum(c3) from yourtable group by memId, col 
union all 
select memId, 'c4' as col, sum(c4) from yourtable group by memId, col 
union all 
select memId, 'c5' as col, sum(c5) from yourtable group by memId, col 
+0

Да, я упомянул об этом в своем вопросе «Я решил, что смогу вытащить каждый раз и объединить их все вместе» –

+0

@sgeddes фактически, GROUP BY логически возникает перед оператором select, поэтому запрос завершается с ошибкой. –

-1

Кажется, я понял вашу точку зрения, упс. Вы переносите информацию в другую таблицу?

Но во-первых, заметка о моем использовании термина нормализации

First Normal Form 
- Eliminate repeating groups in individual tables. 
- Create a separate table for each set of related data. 
- Identify each set of related data with a primary key. 

Итак, ясно, я был неправ о нормализации. Ouch. Хорошо, что Я еще молод, а? :/

Я потратил некоторое время на переоценку этого (роковая ошибка, нет?), А также то, что ограничения SQL Server 2000. Я нашел полезную компиляцию руководства SQL Server 2000, доступного по адресу redware - SQL SERVER Handbook.

Когда дело доходит до табличные выражения ... единственное, что кажется было subqueries и views, хотя ни один истинный Ранжирование функция не доступна (к счастью, вы можете создать Functions).

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

  • Вы по-прежнему будете разбор за стол, по крайней мере N х #Columns быть unpivoted. Никакой сложный шарнир (который не существовал в любом случае).
  • Вместо использования каких-либо дорогостоящих курсовых, SELECT 'C1' прост и легко модифицируется для строк.
  • Вы хотите объединить таблицы, поэтому самым простым методом является UNION ALL.
  • Вы можете запустить GROUP BY один раз после конкатенации.Простой и элегантный.

РЕШЕНИЕ:

SELECT memID 
    , Col 
    , SUM(C1) AS Count 
FROM (
     SELECT 'C1' AS [Col], memID, C1 FROM #Test2 
     UNION ALL SELECT 'C2' AS [Col], memID, C2 FROM #Test2 
     UNION ALL SELECT 'C3' AS [Col], memID, C3 FROM #Test2 
     UNION ALL SELECT 'C4' AS [Col], memID, C4 FROM #Test2 
     UNION ALL SELECT 'C5' AS [Col], memID, C5 FROM #Test2) AS A 
GROUP BY memID, Col 
ORDER BY memID ASC, Col ASC 

Источник Таблица:

CREATE TABLE #Test2 (memID INT, C1 INT, C2 INT, C3 INT, C4 INT, C5 INT) 
INSERT INTO #Test2 (memId, C1, C2, C3, C4, C5) 
VALUES (123, 10, 20, 0, 40, 0) 
    , (123, 0, 20, 0, 40, 5) 
    , (122, 5, 20, 10, 15, 0) 
    , (122, 5, 0, 0, 0, 60) 
    , (155, 10, 0, 0, 10, 10) 
    , (155, 0, 0, 0, 50, 50) 

Результаты:

memID Col Count 
122  C1 10 
122  C2 20 
122  C3 10 
122  C4 15 
122  C5 60 
123  C1 10 
123  C2 40 
123  C3 0 
123  C4 80 
123  C5 5 
155  C1 10 
155  C2 0 
155  C3 0 
155  C4 60 
155  C5 60 

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

+0

У меня уже есть данные в этом формате, мне нужно, чтобы каждый столбец становился строкой в ​​соответствии с приведенным мной примером. –

+0

@DaleFraser см. мой обновленный ответ. обратная связь. Определенно не хочу настаивать на плохом знании! –

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