【问题标题】:How to create Count IF Query?如何创建 Count IF 查询?
【发布时间】:2013-12-23 17:00:04
【问题描述】:

我的表格中的数据如下所示:

VISIT ID | Surgeon | Surgeon Arrival Before Schedule in Minutes | ...
123      | Dr. A   | -45
156      | Dr. A   | -25
198      | Dr. A   | 32
...      | ...

我想构建一个可以分箱和计数的查询,这意味着我想要如下输出:

Surgeon | Bin 1 | Bin 2 | Bin 3 | ... | Bin 6
Dr. A   | 2     | 0     | 4     | ... | 0

上面,Bin(s) 的定义是 Surgeon Arrival Before Schedule in Minutes 列落入具有以下逻辑的 bin 中:

Bin 1 = Surgeon Arrival Before Schedule in Minutes        <= -30
Bin 2 = -30 < Surgeon Arrival Before Schedule in Minutes  <= -15
Bin 3 = -15 < Surgeon Arrival Before Schedule in Minutes  <= 0
Bin 4 = 0   < Surgeon Arrival Before Schedule in Minutes  <= 15
Bin 5 = 15  < Surgeon Arrival Before Schedule in Minutes  <= 30
Bin 6 = Surgeon Arrival Before Schedule in Minutes        > 30

我想COUNT 有多少 Encounter ID 数字落入每个 bin 以产生所需的结果。

我一直在尝试以下查询:

TRANSFORM Count([or on time log].[ENCOUNTER ID]) AS CountOfID

SELECT [or on time log].[Surgeon]

FROM [or on time log]

GROUP BY [or on time log].[Surgeon]

PIVOT IIf([Surgeon Arrival Before Schedule in Minutes] <= -30, "Bin 1",
    IIf(-30 < [Surgeon Arrival Before Schedule in Minutes] <= -15, "Bin 2",
        IIf(-15 < [Surgeon Arrival Before Schedule in Minutes] <=0, "Bin 3",
            IIf(0 < [Surgeon Arrival Before Schedule in Minutes] <=15, "Bin 4",
                IIf(15 < [Surgeon Arrival Before Schedule in Minutes] <= 30, "Bin 5",
                    IIf(30 < [Surgeon Arrival Before Schedule in Minutes], "Bin 6")
                )
            )
        )
    )
)
;

这样做只会给我垃圾箱 1 和 3 Surgeon,这是不准确的。

【问题讨论】:

  • 这本质上是一个 PIVOT/CROSSTAB 查询:office.microsoft.com/en-ca/access-help/… 您需要将您的 bin 逻辑转换为 sql 等效项。
  • 我已经更新了我的问题,以反映基于您提供的链接的 sql 重写,谢谢,它确实有很大帮助。
  • 我没有 sql2012 来测试这个,但 a &lt; b &lt;= c 在 2008 年是一个完全的语法错误。
  • 感谢您的帮助@MarcB

标签: sql ms-access count ms-access-2007 iif


【解决方案1】:

作为第一步,为每个到达分配箱号。

这是我使用的示例表。

VISIT_ID Surgeon Arrival
     123 Dr. A       -45
     156 Dr. A       -25
     198 Dr. A        32

下面的查询使用 Switch 表达式来分配 bin 编号,给我这个结果集。

VISIT_ID Surgeon Arrival bin_number
     123 Dr. A       -45          1
     156 Dr. A       -25          2
     198 Dr. A        32          6

SELECT
    o.VISIT_ID,
    o.Surgeon,
    o.Arrival,
    Switch
        (
            o.Arrival <= -30, 1,
            o.Arrival <= -15, 2,
            o.Arrival <=   0, 3,
            o.Arrival <=  15, 4,
            o.Arrival <=  30, 5,
            o.Arrival >   30, 6,
        ) AS bin_number
FROM OR_on_time_log AS o;

您可以在此基础上使用 PIVOT 返回每​​位外科医生的垃圾箱计数。

【讨论】:

    【解决方案2】:

    正如at this link here所描述的那样,我将采用一种不同的方式来解决这个问题

    代码如下:

    SELECT [or on time log].Surgeon
    , sum(iif([or on time log].[surgeon arrival before schedule in minutes] < -30,1,0)) 
      as Bin1
    , sum(iif([or on time log].[surgeon arrival before schedule in minutes] > -30 
        and [or on time log].[surgeon arrival before schedule in minutes] <= -15,1,0)) 
      as Bin2
    , sum(iif([or on time log].[surgeon arrival before schedule in minutes] > -15 
        and [or on time log].[surgeon arrival before schedule in minutes] <= -0,1,0)) 
      as Bin3
    , ...
    FROM [or on time log]
    group by [or on time log].surgeon
    

    【讨论】:

      猜你喜欢
      • 2012-05-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-28
      • 1970-01-01
      • 2015-04-23
      • 2014-12-16
      相关资源
      最近更新 更多