2017-10-11 25 views
0

我是新来的SQL,尝试自我教导,并且已经与我一样挣扎,应该是一个非常简单的查询,或者至少是一个非常常见的一个。我甚至不确定我是否知道用词汇来描述我想要达到的目标,所以如果这个帖子的标题竟然是误导性的,那么我很抱歉! :)在同一个查询中使用相同的列对不同组合的结果返回数据

我有一个大的数据库。我想识别一行中2个结果一起出现的行,或者同一列中的另一个2个结果在设定的时间段内一起出现。

我开始使用AND但结果为零。我花了整整两三个小时在网上搜索,但成果有限。似乎有很多类似的线程暗示UNION,SELECT DISTINCT,JOIN或其他解决方案,但我完全无法根据我的需要调整它们。

任何指针非常赞赏。

所以,我的表称为VNH.dbo.ClinicalCaseItem

数据表看起来像这样:

ActualDateTime | CaseId | ProcedureTestId | Description | FeeAmount 

我需要限制ActualDateTime大于2017-04-03或条目的数量会碰上十万100S 。 ProcedureTestId是关键列。我需要专门将CaseIdProcedureTestId 309ProcedureTestId 245一起出现,而那些CaseIdProcedureTestId 309ProcedureTestId 326一起出现。

我不会详细说明我尝试过的所有不同的查询,因为已经有半打左右,没有人接近实现我需要的结果,而且大多数都完全失败。

提前感谢

示例数据:

ActualDateTime | CaseId | ProcedureTestId | Description  | FeeAmount 
    2017-04-25 | 123456 | 309    | Place iv catheter | 30.00 
    2017-04-25 | 123456 | 329    | GA Patient  | 100.00 
    2017-04-27 | 134523 | 309    | Place iv catheter | 30.00 
    2017-04-27 | 234567 | 245    | Sedate Patient | 45.00 
    2017-04-28 | 234567 | 309    | Place iv catheter | 30.00 
    2017-04-28 | 345321 | 245    | Sedate Patient | 45.00 
    2017-04-29 | 451324 | 309    | Place iv catheter | 30.00 
    2017-04-30 | 451324 | 309    | Place iv catheter | 30.00 
    2017-04-30 | 451324 | 375    | Surgical Pack  | 28.00 
    2017-04-25 | 989898 | 309    | Place iv catheter | 30.00 
    2017-04-27 | 989898 | 245    | Sedate Patient | 45.00 
    2017-04-25 | 999999 | 309    | Place iv catheter | 30.00 
    2017-04-27 | 999999 | 245    | Sedate Patient | 45.00 
    2017-04-27 | 999999 | 326    | Bathe Patient  | 45.00 
    2017-04-27 | 987654 | 375    | Surgical Pack  | 28.00 
    2017-04-25 | 987654 | 309    | Place iv catheter | 30.00 
    2017-04-27 | 987654 | 245    | Sedate Patient | 45.00 
    2017-04-27 | 987654 | 329    | GA Patient  | 100.00 
    2017-04-27 | 987654 | 326    | Bathe Patient  | 45.00 

查询的预期结果将是:

ActualDateTime | CaseId | ProcedureTestId | Description  | FeeAmount | count_of 
    2017-04-25 | 123456 | 309    | Place iv catheter | 30.00  | 2 
    2017-04-25 | 123456 | 329    | GA Patient  | 100.00 | 2 
    2017-04-27 | 234567 | 245    | Sedate Patient | 45.00  | 2 
    2017-04-28 | 234567 | 309    | Place iv catheter | 30.00  | 2 
    2017-04-25 | 989898 | 309    | Place iv catheter | 30.00  | 2 
    2017-04-27 | 989898 | 245    | Sedate Patient | 45.00  | 2 
    2017-04-25 | 999999 | 309    | Place iv catheter | 30.00  | 2 
    2017-04-27 | 999999 | 245    | Sedate Patient | 45.00  | 2 
    2017-04-25 | 987654 | 309    | Place iv catheter | 30.00  | 3 
    2017-04-27 | 987654 | 245    | Sedate Patient | 45.00  | 3 
    2017-04-27 | 987654 | 329    | GA Patient  | 100.00 | 3 
+0

实际的数据样本将帮助。问题:“键列”是什么意思?它是主键还是外键? – Alex

+0

对不起,只是说 - 最重要的 - 就像我的问题所依赖的那个。 示例数据: – be4con

+0

示例数据请输出您想要的结果。 – Alex

回答

1

有样本数据是非常有帮助的,但除非它被耦合到“预期的结果”,我们不能比较任何查询输出;因此我们只能发明一些可能起作用的东西 - 这是我在下面介绍的。

我对你的话的解释是,如果案件至少经过程序(309和245)或(309和326),你需要caseid。现在,当我将该要求与示例数据进行比较时,我找不到符合该标准的任何行,因此我添加了一些符合该条件的行。但是还要注意,在逻辑上我采用了任何有程序的案例(245和326,但不是309)也将被退回。

这里的基本“技巧”(又名“方法”)是在SUM()函数中使用一个case表达式,并使用having子句(允许基于聚合值过滤结果)对其进行评估。

This SQL Fiddle让我们来执行您自己的试用查询。

的MS SQL Server 2014架构设置

CREATE TABLE Table1 
    ([ActualDateTime] datetime, [CaseId] int, [ProcedureTestId] int, [Description] varchar(17), [FeeAmount] int) 
; 

INSERT INTO Table1 
    ([ActualDateTime], [CaseId], [ProcedureTestId], [Description], [FeeAmount]) 
VALUES 
    ('2017-04-25 00:00:00', 989898, 309, 'Place iv catheter', 30.00), 
    ('2017-04-27 00:00:00', 989898, 245, 'Sedate Patient', 45.00), 

    ('2017-04-25 00:00:00', 999999, 309, 'Place iv catheter', 30.00), 
    ('2017-04-27 00:00:00', 999999, 245, 'Sedate Patient', 45.00), 
    ('2017-04-27 00:00:00', 999999, 326, 'whatever 326 is', 45.00), 

    ('2017-04-25 00:00:00', 123456, 309, 'Place iv catheter', 30.00), 
    ('2017-04-25 00:00:00', 123456, 329, 'GA Patient', 100.00), 
    ('2017-04-27 00:00:00', 134523, 309, 'Place iv catheter', 30.00), 
    ('2017-04-27 00:00:00', 234567, 245, 'Sedate Patient', 45.00), 
    ('2017-04-28 00:00:00', 234567, 309, 'Place iv catheter', 30.00), 
    ('2017-04-28 00:00:00', 345321, 245, 'Sedate Patient', 45.00), 
    ('2017-04-29 00:00:00', 451324, 309, 'Place iv catheter', 30.00), 
    ('2017-04-30 00:00:00', 451324, 309, 'Place iv catheter', 30.00), 
    ('2017-04-30 00:00:00', 451324, 375, 'Surgical Pack', 28.00) 
; 

查询1

 select CaseId 
     , sum(case when ProcedureTestId in (309,245,326) then 1 else 0 end) count_of 
     from Table1 
     group by CaseId 
     having sum(case when ProcedureTestId in (309,245,326) then 1 else 0 end) > 1 

Results

| CaseId | count_of | 
|--------|----------| 
| 234567 |  2 | 
| 451324 |  2 | 
| 989898 |  2 | 
| 999999 |  3 | 

查询2

select 
     t.*, d.count_of 
from Table1 t 
inner join (
     select CaseId 
     , sum(case when ProcedureTestId in (309,245,326) then 1 else 0 end) count_of 
     from Table1 
     group by CaseId 
     having sum(case when ProcedureTestId in (309,245,326) then 1 else 0 end) > 1 
    ) d on t.CaseId = d.CaseId 
order by caseid, ProcedureTestId 

Results

|  ActualDateTime | CaseId | ProcedureTestId |  Description | FeeAmount | count_of | 
|----------------------|--------|-----------------|-------------------|-----------|----------| 
| 2017-04-27T00:00:00Z | 234567 |    245 | Sedate Patient |  45 |  2 | 
| 2017-04-28T00:00:00Z | 234567 |    309 | Place iv catheter |  30 |  2 | 
| 2017-04-29T00:00:00Z | 451324 |    309 | Place iv catheter |  30 |  2 | 
| 2017-04-30T00:00:00Z | 451324 |    309 | Place iv catheter |  30 |  2 | 
| 2017-04-30T00:00:00Z | 451324 |    375 |  Surgical Pack |  28 |  2 | 
| 2017-04-27T00:00:00Z | 989898 |    245 | Sedate Patient |  45 |  2 | 
| 2017-04-25T00:00:00Z | 989898 |    309 | Place iv catheter |  30 |  2 | 
| 2017-04-27T00:00:00Z | 999999 |    245 | Sedate Patient |  45 |  3 | 
| 2017-04-25T00:00:00Z | 999999 |    309 | Place iv catheter |  30 |  3 | 
| 2017-04-27T00:00:00Z | 999999 |    326 | whatever 326 is |  45 |  3 | 
+0

注意“预期结果”的重要性(例如,您是想要总结还是详细布局?),而且样本数据也应该为“预期结果”提供数据。 –

+0

谢谢。有趣的是,我提供的样本数据确实有匹配的行,但您的解释是正确的。查询2的结果几乎是我正在寻找的。我需要不包含ProcedureTestId 309的行CaseId和不包含309,326或245的任何ProcedureTestId,因此所有CaseId 451324和最后一行999999都将被排除。我将编辑我的文章以包含扩展数据表并添加结果表。 – be4con

相关问题