0

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

我的表中有这样的数据:

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

4

1 回答 1

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

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

于 2013-09-23T16:04:00.723 回答