MSSQL运行IN OUT计数记录

时间:2017-06-26 18:54:50

标签: sql-server-2008-r2 crystal-reports

我正在尝试创建一个报告,计算每天有多少人登录某个部分或退出某个部分。

package query;

import java.net.URL;
import java.net.URLConnection;
import java.nio.charset.Charset;

import java.util.*;
import java.io.*;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

public class Stockquery {

public static void main(String[] args) {

    String jsonString = callURL(
            "https://www.quandl.com/api/v3/datasets/SSE/HYQ.json?start_date=2017-01-01&end_date=2017-01-31");

    try {
        JSONObject jsonobjects = new JSONObject(jsonString);

        JSONObject dataset = jsonobjects.getJSONObject("dataset");
        JSONArray array = dataset.getJSONArray("data");
        System.out.println(array.get(2));
        System.out.println(array.get(3));

        array.getString(0);
        System.out.println(array.getString(0));

    } catch (JSONException e) {
        e.printStackTrace();
    }

}

public static String callURL(String myURL) {
    // System.out.println("Requested URL:" + myURL);
    StringBuilder sb = new StringBuilder();
    URLConnection urlConn = null;
    InputStreamReader in = null;
    try {
        URL url = new URL(myURL);
        urlConn = url.openConnection();
        if (urlConn != null)
            urlConn.setReadTimeout(60 * 1000);
        if (urlConn != null && urlConn.getInputStream() != null) {
            in = new InputStreamReader(urlConn.getInputStream(), Charset.defaultCharset());
            BufferedReader bufferedReader = new BufferedReader(in);
            if (bufferedReader != null) {
                int cp;
                while ((cp = bufferedReader.read()) != -1) {
                    sb.append((char) cp);
                }
                bufferedReader.close();
            }
        }
        in.close();
    } catch (Exception e) {
        throw new RuntimeException("Exception while calling URL:" + myURL, e);
    }

    return sb.toString();
}

示例数据:

select inout.name_id, nametable.name, inout.datetime, inout.status, inout.section
from inout
join nametable on inout.name_id = nametable.name_id
where inout.date between '1/1/2016' and '1/3/2016'
order by inout.date

然后是最终结果:

Datetime          Name   Section  Status
1/1/2016 1:34:56  John   A        IN
1/1/2016 4:11:11  Steve  A        OUT
1/1/2016 18:20:20 Bill   A        IN
1/2/2016 13:13:13 John   A        OUT
1/2/2016 12:12:12 Ben    A        IN
1/3/2016 1:01:01  JIM    A        IN
编辑:认为IN状态会给运行计数+1,而OUT会给-1,所以如果一个人上班或离开工作当天我可以看到有多少人在特定部分工作那天,我不太确定如何在那个日期范围之前为那些人展示。

1 个答案:

答案 0 :(得分:0)

这不是一个答案,但可以帮助其他人形象化,并可能激励你(但我认为你确实尝试过):

  1. 使用您发布的查询。
  2. 在Crystal设计器中,按列' Datetime'。
  3. 创建一个组
  4. 创建公式:if {inout.status} = "IN" then 1 else -1。让我们说它的名字是@Quantifier。
  5. 创建一个运行总计字段:字段汇总= @Quantifier,摘要类型=总和,评估每条记录,从不重置。我们称之为#NumberOfPeopleInSection_CloseButNoCigar。
  6. 将正在运行的总字段放在组页脚中。
  7. 正如你所说的那样,结果并不是你想要的,因为有这样的"史蒂夫出去"没有先前的"史蒂夫在"。所以它仍然需要一个技巧。

    enter image description here

    要在解决方案中将其关闭,您可以尝试其他查询来获取初始计数。尝试一下:

    select sum(case when status='IN' then 1 else -1 end)
    from inout
    join nametable on inout.name_id = nametable.name_id
    where inout.datetime < '2016-1-1'
    

    然后在最终结果中考虑这个初始值。