我试图在名为“代码”的列中获取表中项目的最大数量。
我的表中有数据如下:
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 :(得分: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
您的问题来自您错误建模的数据。修复您的数据,您的查询很容易。