使用多列计数Max

时间:2013-09-23 15:57:53

标签: sql tsql sql-server-2008-r2

我试图在名为“代码”的列中获取表中项目的最大数量。

我的表中有数据如下:

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列准确计算项目?或者有没有办法将所有这些代码放入一列并按此计算?我不知道该怎么做。

1 个答案:

答案 0 :(得分: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

您的问题来自您错误建模的数据。修复您的数据,您的查询很容易。