2013-09-23 5 views
0

Я пытаюсь получить максимальное количество элементов в таблице в столбце «Код».Count Max, используя несколько столбцов

У меня есть данные в моей таблице, как это:

ID Contact Date  Service  Code   Tech Code1 Code2 Code3 Code4 Code5 
1 306  5/8/2009 Individual 30751 3004  Mike 30751 3004 NULL NULL NULL 
2 306  5/13/2009 Individual 30751 3004  Mike 30751 3004 NULL NULL NULL 
3 308  4/17/2009 Testing  29631   Keith 29631 NULL NULL NULL NULL 
4 318  4/20/2009 Individual 29633   Carol 29633 NULL NULL NULL NULL 
5 318  4/27/2009 Individual 29633   Carol 29633 NULL NULL NULL NULL 
6 318  4/13/2009 Individual 29633   Carol 29633 NULL NULL NULL NULL 
7 318  5/4/2009 Individual 29633   Carol 29633 NULL NULL NULL NULL 
8 318  5/11/2009 Individual 29633   Carol 29633 NULL NULL NULL NULL 
9 320  4/27/2009 Office  5781 3004 4019 Ed  5781 3004 4019 NULL NULL 
10 324  4/17/2009 Individual 3004   Julie 3004 NULL NULL NULL NULL 
11 324  2/20/2009 Individual 3004   Julie 3004 NULL NULL NULL NULL 
12 324  4/3/2009 Individual 3004   Julie 3004 NULL NULL NULL NULL 
13 325  5/19/2009 Interview 3090   Max  3090 NULL NULL NULL NULL 

Обратите внимание на столбец Код иногда имеет более одного элемента, разделенных пробелом. В этом случае второй код переходит в столбец Code2, и если есть третий код, он перейдет в столбец Code3.

В настоящее время мы используем такой запрос, чтобы найти наиболее распространенный код, однако он не является точным для строк, содержащих более одного элемента в столбце «Код».

SELECT * FROM ( SELECT ID, 
            CASE 
             WHEN dd1.allowed = 1 AND dd1.co_allowed = 1 THEN Code1 
             WHEN dd2.allowed = 1 AND dd2.co_allowed = 1 THEN Code2 
             WHEN dd3.allowed = 1 AND dd3.co_allowed = 1 THEN Code3 
            END AS Code, 
            ROW_NUMBER() OVER(PARTITION BY ID ORDER BY Date DESC) AS RowNum 
           FROM MC 
            LEFT JOIN ReferenceTables.dbo.dim_code dd1 ON MC.Code1 = dd1.no_decimal 
            LEFT JOIN ReferenceTables.dbo.dim_code dd2 ON MC.Code2 = dd2.no_decimal 
            LEFT JOIN ReferenceTables.dbo.dim_code dd3 ON MC.Code3 = dd3.no_decimal 
           WHERE (dd1.allowed = 1 AND dd1.co_allowed = 1) 
            OR (dd2.allowed = 1 AND dd2.co_allowed = 1) 
            OR (dd3.allowed = 1 AND dd3.co_allowed = 1)) x 
         WHERE RowNum = 1 

Как я могу точно подсчитать элементы, используя столбцы Code1, Code2, Code3 и Code4? Или есть способ поставить все эти коды в один столбец и подсчитать так? Я не уверен, как это сделать.

ответ

0

Самое чистое решение - удалить столбец «Код» из этой таблицы и добавить таблицу Service_X_Code.

create table Service_X_code 
(service_id int not null, 
code integer) 

В этой таблице можно смоделировать ваши отношения во многих отношениях для обслуживания кодов. Затем просто:

select count(*), code 
from service_x_code 
group by code 

Ваша проблема исходит из ваших неверно смоделированных данных. Исправьте свои данные, и ваш запрос прост.