【问题标题】:Subquery Structures SQL子查询结构 SQL
【发布时间】:2018-12-13 18:08:59
【问题描述】:

SQL 新手,我正在使用查询结构。

让我们再试一次。

我正在尝试嵌套两个单独的代码,因此最终输出如下所示:

FIN   Level1 Level2 Level 3             FCT_MAX   FCT_MAX_Charges    CPT CPT_Charges  DELTA 
1     1        0       1                9284       200                9283    100        100
2     0        1       1                9284       200                9281     50         150     

第一个代码(称为代码 X)生成下表。此代码的目的是将具有相同 FIN 的记录连接成一行,并创建 DELTA 变量和 CHARGES 变量。

USE EMTCQIData

SELECT FIN, Clinical, FCT_MAX, FCT_MAX_CHARGES, CPT, CPT_CHARGES, 
(FCT_MAX_CHARGES - CPT_CHARGES) AS DELTA

FROM
(
SELECT CONC.[Financial Number] as FIN, CONC.Clinical, 

   CASE
          WHEN CONC.Clinical like '%level 5%' THEN '99285' 

   END FCT_MAX,

   CASE
          WHEN CONC.Clinical like '%level 5%' THEN CAST($3768 AS int) 
   END FCT_MAX_CHARGES,

   CPT.CPT,

   CASE
          WHEN CPT.CPT like '99285' THEN CAST($3768 AS int) 
   END CPT_CHARGES
   FROM CPT_MASTER as CPT

 INNER JOIN 

(
SELECT DISTINCT ST2.[Financial Number], 
SUBSTRING(
    (
        SELECT ','+ST1.[Clinical Event Result]  AS [text()]
        FROM ED_FCT_Q1_FY19 ST1
        WHERE ST1.[Financial Number] = ST2.[Financial Number] AND ST1.[Clinical Event Result]<> 'No'
              Order BY [Financial Number] 
        FOR XML PATH ('')
    ), 2, 1000) [Clinical]
FROM ED_FCT_Q1_FY19 ST2
)
as CONC ON CONC.[Financial Number]=CPT.FIN
WHERE CPT.CPT LIKE '9928%'
)
AS COMPLETE

ORDER BY FIN

代码 X 中的表格

FIN   Clinical                              FCT_MAX    FCT_MAX_Charges    CPT   CPT_Charges    DELTA 
1     Discharge[Level1] Transfer[Leve3]         9284       200           9283     100          100

我想要此表的唯一更改是临床列按级别解析。因此,例如,任何临床 1 级事件都会有自己的列,对于 2 级、3 级一直到 5 级事件也是如此。

为了解析出事件,我开发了另一个代码(CODE Z)见下文,这段代码解析出 CLINICAL EVENT COLUMN;但是,它不会连接列,下面是示例输出:

FIN          Level1     Level 2     Level3   ...                                      
1            1            0            1
1            0            0            1
2            1            1            1
3            0            0            1
3            1            1            1

代码 Z

SELECT [Financial Number], [Clinical Event Result],

CASE
   WHEN [Clinical Event Result] like '%1:1 Nursing care%' Then '1'
      ELSE '0'
End [1:1 Nursing Care]
...

FROM ED_FCT_Q1_FY19

我的来源数据: ED_FCT_Q1_FY19 具有以下列- 财务编号、临床事件结果、收费代码 此数据在多行中包含相同的财务编号

CPT_MASTER- 鳍,中华映管 此数据在多行中包含相同的 FIN

如前所述,最终所需的表将仅包含唯一的 FIN/财务 ID。 FIN 可以链接到财务 ID。

【问题讨论】:

  • 既然您“尝试”和“遇到困难”,请发布您尝试的代码和您遇到的错误。从您迄今为止发布的内容中无法判断您正在尝试做什么。
  • 感谢@TabAlleman!我更新了上面的帖子以反映我失败的尝试。我很抱歉没有遵守发帖礼仪!感谢您的时间和回应!
  • 您的最后一个案例对于初学者来说没有“END”......它只有“ND”。
  • @pmbAustin,抱歉,复制和粘贴时出错。
  • 对于您对 JaninCode 的回答的评论,这实际上似乎是一个 XY Problem;你为什么不改写你的问题,询问你想要做什么,你的源数据和期望的结果是什么,然后你的代码作为解决它的尝试?

标签: sql sql-server nested subquery


【解决方案1】:

如果我理解您的要求...您可以将查询 B 放入临时表中,然后将其连接到会限制结果的查询 A,前提是有一个允许连接的公用键。

SELECT FIN, Clinical, FCT_MAX, FCT_MAX_CHARGES, CPT, CPT_CHARGES, 
(FCT_MAX_CHARGES - CPT_CHARGES) AS DELTA
into #QueryB
FROM
(
SELECT CONC.[Financial Number] as FIN, CONC.Clinical, 

   CASE
          WHEN CONC.Clinical like '%level 5%' THEN '99285' 
   END FCT_MAX,

   CASE
          WHEN CONC.Clinical like '%level 5%' THEN CAST($3768 AS int) 
   END FCT_MAX_CHARGES,

   CPT.CPT,

   CASE
          WHEN CPT.CPT like '99285' THEN CAST($3768 AS int) 
   ND CPT_CHARGES


 FROM CPT_MASTER as CPT

INNER JOIN 

(
SELECT DISTINCT ST2.[Financial Number], 
SUBSTRING(
    (
        SELECT ','+ST1.[Clinical Event Result]  AS [text()]
        FROM ED_FCT_Q1_FY19 ST1
        WHERE ST1.[Financial Number] = ST2.[Financial Number] AND ST1. 
[Clinical Event Result]<> 'No'--removing No's from Clinical that appeared in 
the begining of the rows
              Order BY [Financial Number] 
        FOR XML PATH ('')
    ), 2, 1000) [Clinical]
FROM ED_FCT_Q1_FY19 ST2
)
as CONC ON CONC.[Financial Number]=CPT.FIN
WHERE CPT.CPT LIKE '9928%'
)
as complete 

然后将其加入到查询 A 中,以将 A 的结果限制为 B 中的结果

SELECT [Financial Number], [Clinical Event Result],

CASE
   WHEN [Clinical Event Result] like '%1:1 Nursing care%' Then '1'
      ELSE '0'
End [1:1 Nursing Care],
....
FROM ED_FCT_Q1_FY19 a
join #QueryB b on a.[some criteria] = b.[some criteria]

事实上,您可以创建所有这些嵌套查询的临时表,然后将它们连接起来,就像使用查询 B 完成的一样。我发现当您多次从较大的数据集中提取临时表时,速度要快得多,因为它抓取数据并存储它,而不是每次都运行嵌套选择。

【讨论】:

  • 为什么不使用 CTE 而不是临时表?
  • 随时提供该解决方案。这就是最初在查询 B 中发生的事情,所以我觉得提供另一种分解方式很有用。有时,拥有大量嵌套查询非常复杂且难以调试,而创建单独的数据集并将它们连接起来则更直接且更易于逐步验证。
  • 感谢@JenInCode,您的解决方案绝对是朝着正确方向迈出的一步,但是由于我解释情况的工作乏善可陈,事情变得更加复杂。 QUERY A 代码包含具有相同 [财务编号] 的多条记录。查询 B 将多行连接成一行。例如,将 [Financial Number] 1 包含 4 条记录的某人连接成一行。无论如何,使用您提供的代码,我看到 [Financial Number] 变量的多条记录。在结果中,我还缺少 CPT CPT_MAX 等变量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-10
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多