我有一组CODE_1-10列,其中包含诊断代码。我想创建一组变量CODE_GROUP_1-17,它们指示某些特定诊断代码集中的一个是否与任何CODE_1-10变量匹配。例如,CODE_GROUP_1 = 1,如果CODE_1-10中的任何一个匹配' 123'或者' 456'和CODE_GROUP_2 = 1如果任何CODE_1-10匹配' 789'' 111'' 333',&# 39; 444'或者' foo'。
以下是使用值构造函数执行此操作的示例。
CASE WHEN (SELECT count(value.val)
FROM (VALUES (CODE_1)
, (CODE_2)
, (CODE_3)
, (CODE_4)
, (CODE_5)
, (CODE_6)
, (CODE_7)
, (CODE_8)
, (CODE_9)
, (CODE_10)
) AS value(val)
WHERE value.val in ('123', '456')
) > 0 THEN 1 ELSE 0 END AS CODE_GROUP_1,
CASE WHEN (SELECT count(value.val)
FROM (VALUES (CODE_1)
, (CODE_2)
, (CODE_3)
, (CODE_4)
, (CODE_5)
, (CODE_6)
, (CODE_7)
, (CODE_8)
, (CODE_9)
, (CODE_10)
) AS value(val)
WHERE value.val in ('789','111','333','444','foo')
) > 0 THEN 1 ELSE 0 END AS CODE_GROUP_2
我想知道是否还有另一种方法可以提高效率。有没有办法制作一个带有CODE_1-10数组的CLR UDF,并输出一组CODE_GROUP_1-17列?
答案 0 :(得分:2)
你至少可以避免重复FROM (VALUES ...)
这样:
SELECT
CODE_GROUP_1 = COUNT(DISTINCT CASE WHEN val IN ('123', '456') THEN 1 END),
CODE_GROUP_2 = COUNT(DISTINCT CASE WHEN val IN ('789','111','333','444','foo') THEN 1 END),
...
FROM
(
VALUES
(CODE_1),
(CODE_2),
(CODE_3),
(CODE_4),
(CODE_5),
(CODE_6),
(CODE_7),
(CODE_8),
(CODE_9),
(CODE_10)
) AS value(val)
如果CODE_1
,CODE_2
等是列名,则可以在CROSS APPLY中将上述查询用作派生表:
SELECT
...
FROM
dbo.atable -- table containing CODE_1, CODE_2 etc.
CROSS APPLY
(
SELECT ... -- the above query
) AS x
;
答案 1 :(得分:0)
您可以创建2个新表,并将列作为行附加吗?因此,如果您需要保留1-10值和dx代码以及您需要的任何关键字段,那么一个表将是带有源列的dxCode,另一个表将是包含17个组的dxGroup,如果您需要源组ID需要它,以及你的目标dx值。 然后,要确定哪些代码在哪些组中,您可以加入dx字段。