由于切换部门

时间:2018-05-31 13:20:35

标签: sql oracle oracle11g

我遇到了问题,我的公司有一个客户满意度计划,它从我们的数据库系统中的不同表中获取大量数据。

问题是我只想显示特定部门的客户满意度百分比,因此只显示此特定部门的员工。

表中的问题是我从中获取员工,如果他们已经切换了部门,那么同一员工会有重复,所以如果他们在1年前在1个部门工作,今天又搬到另一个部门,它会告诉我即使他们已经切换了部门,因为他们使用相同的ID注册,我们的SQL程序中的逻辑代码如下:

"KS_DRIFT.V_AGENT_ALLOCATION age ON " + (queryParams.JoinOnFirstAgent ? "FØRSTE_AGENT" : "SIDSTE_AGENT") + " = age.AGENT_INITIALS AND TRUNC(TIDSPUNKT) BETWEEN ALLOCATION_START AND ALLOCATION_END " +
                  "WHERE " + 
                      "TRUNC(TIDSPUNKT) BETWEEN " + OracleConversion.ToOracleDate(queryParams.Interval.Lower) + " AND " + OracleConversion.ToOracleDate(queryParams.Interval.Upper)

我不确定如何根据此sql查询确保它仅取出当前员工处于活动状态的部门?我希望任何人都可以帮助我更接近解决方案。

修改

COMPLETE QUERY

var sql = "SELECT " + 
                      "SPØRGSMÅL_ID, " +
                      "KARAKTER, " +
                      "COUNT(*) AS COUNT " +
                  "FROM " + 
                      "KS_DRIFT.KT_KARAKTER kara " +
                  "LEFT JOIN " + 
                      "KS_DRIFT.KT_BESVARELSE besv ON kara.BESVARELSE_ID = besv.EKSTERN_ID AND kara.TYPE = besv.TYPE " +
                  "LEFT JOIN " +
                      "KS_DRIFT.V_AGENT_ALLOCATION age ON " + (queryParams.JoinOnFirstAgent ? "FØRSTE_AGENT" : "SIDSTE_AGENT") + " = age.AGENT_INITIALS AND TRUNC(TIDSPUNKT) BETWEEN ALLOCATION_START AND ALLOCATION_END " +
                  "WHERE " + 
                      "TRUNC(TIDSPUNKT) BETWEEN " + OracleConversion.ToOracleDate(queryParams.Interval.Lower) + " AND " + OracleConversion.ToOracleDate(queryParams.Interval.Upper) + " AND " +
                      "SPØRGSMÅL_ID = " + queryParams.QuestionId +
                      (!queryParams.IncludeCDNs.IsNullOrEmpty() ? "AND CDN IN (" + queryParams.IncludeCDNs.ToDelimitedString(", ") + ") " : "") +
                      (!queryParams.ExcludeCDNs.IsNullOrEmpty() ? "AND CDN NOT IN (" + queryParams.ExcludeCDNs.ToDelimitedString(", ") + ") " : "") +
                      (!queryParams.AgentIds.IsNullOrEmpty() ? " AND AGENT_ID IN (" + queryParams.AgentIds.ToDelimitedString(", ") + ") " : "") +
                      (!queryParams.TeamIds.IsNullOrEmpty() ? " AND TEAM_ID IN (" + queryParams.TeamIds.ToDelimitedString(", ") + ") " : "") +
                  "GROUP BY " +
                      "SPØRGSMÅL_ID, " +
                      "KARAKTER";

使用Gerard建议的查询

时出现错误消息
  

ORA-00932:inkonsistente datatyper:forventede DATE,fik NUMBER      ved Oracle.DataAccess.Client.OracleException.HandleErrorHelper(Int32 errCode,OracleConnection conn,IntPtr opsErrCtx,OpoSqlValCtx * pOpoSqlValCtx,Object src,String procedure,Boolean bCheck)      ved Oracle.DataAccess.Client.OracleException.HandleError(Int32 errCode,OracleConnection conn,String procedure,IntPtr opsErrCtx,OpoSqlValCtx * pOpoSqlValCtx,Object src,Boolean bCheck)      ved Oracle.DataAccess.Client.OracleCommand.ExecuteReader(布尔重新查询,布尔fillRequest,CommandBehavior行为)      ved Oracle.DataAccess.Client.OracleCommand.ExecuteReader()

     

ved NDDataProvider.Database.Oracle.Connection.DBConnection.ExecuteQuery(String query)i S:\ s0book \ ND Udviklings Dokumentation \ Git Repository dump - THOMAS HER \ NDSolution \ DOPe Data Provider \ Database \ Oracle \ Connection \ DBConnection。 cs:linje 456

OracleConversion.cs

    public class OracleConversion {

    public static string ToOracleValue(object value) {
        if (value == null)
            return "null";

        if (value is string)
            return OracleConversion.ToOracleString((String)value);

        if (value is Enum)
            return OracleConversion.ToOracleInteger((int)value);

        int integerValue;

        if (Int32.TryParse(value.ToString(), out integerValue))
            return OracleConversion.ToOracleInteger(integerValue);

        decimal decimalValue;

        if (Decimal.TryParse(value.ToString(), out decimalValue))
            return OracleConversion.ToOracleDecimal(decimalValue);

        if (value is Boolean)
            return OracleConversion.ToOracleBoolean((Boolean)value);

        if (value is DateTime)
            return OracleConversion.ToOracleDateTime((DateTime)value);

        if (value is NDUtilities.Time)
            return OracleConversion.ToOracleInteger(((NDUtilities.Time)value).SecondsOfDay);

        if (value is SolutionsEntity)
            return OracleConversion.ToOracleInteger(((SolutionsEntity)value).Id);

        return OracleConversion.ToOracleString(value.ToString());
    }

    public static string ToOracleBoolean(Nullable<bool> booleanValue) {
        string returnValue;

        if (booleanValue == null)
            returnValue = "null";
        else
            returnValue = (booleanValue.Value) ? "1" : "0";

        return returnValue;
    }

    public static string ToOracleInteger(Nullable<int> integerValue) {
        string returnValue;

        if (integerValue == null)
            returnValue = "null";
        else
            returnValue = integerValue.ToString();

        return returnValue;
    }

    public static string ToOracleDecimal(Nullable<decimal> decimalValue) {
        string returnValue;

        if (decimalValue == null)
            returnValue = "null";
        else
            returnValue = decimalValue.Value.ToString().Replace(",", ".");

        return returnValue;
    }

    public static string ToOracleString(string stringValue) {
        string returnValue;

        if (stringValue == null)
            returnValue = "null";
        else {
            returnValue = stringValue.Replace("'", "''");

            returnValue = "'" + returnValue + "'";
        }

        return returnValue;
    }

    public static string ToOracleDate(DateTime? dateTimeValue) {
        string returnValue;

        if (dateTimeValue == null)
            returnValue = "null";
        else
            returnValue = OracleConversion.ToOracleString(dateTimeValue.Value.ToString("yyyy-MM-dd"));

        return returnValue;
    }

    public static string ToOracleDateTime(DateTime? dateTimeValue) {
        string returnValue;

        if (dateTimeValue == null)
            returnValue = "null";
        else
            returnValue = "TO_DATE(" + OracleConversion.ToOracleString(dateTimeValue.Value.ToString("yyyy-MM-dd HH:mm:ss")) + ", " + OracleConversion.ToOracleString("yyyy-mm-dd hh24:mi:ss") + ")";

        return returnValue;
    }
}

}

1 个答案:

答案 0 :(得分:1)

只需在sysdate和分配列上添加测试

var sql = "SELECT " +
                  "SPØRGSMÅL_ID, " +
                  "KARAKTER, " +
                  "COUNT(*) AS COUNT " +
              "FROM " + 
                  "KS_DRIFT.KT_KARAKTER kara " +
              "LEFT JOIN " + 
                  "KS_DRIFT.KT_BESVARELSE besv ON kara.BESVARELSE_ID = besv.EKSTERN_ID AND kara.TYPE = besv.TYPE " +
              "LEFT JOIN " +
                  "KS_DRIFT.V_AGENT_ALLOCATION age ON " + (queryParams.JoinOnFirstAgent ? "FØRSTE_AGENT" : "SIDSTE_AGENT") + " = age.AGENT_INITIALS AND TIDSPUNKT >= ALLOCATION_START AND TIDSPUNKT < ALLOCATION_END + 1  " +
                  "and sysdate BETWEEN ALLOCATION_START AND ALLOCATION_END " +
              "WHERE TIDSPUNKT >= to_date(" +
                  OracleConversion.ToOracleDate(queryParams.Interval.Lower) +
                  ",'YYYY-MM-DD') AND TIDSPUNKT < to_date(" +
                  OracleConversion.ToOracleDate(queryParams.Interval.Upper) +
                  ",'YYYY-MM-DD') + 1 AND " +
                  "SPØRGSMÅL_ID = " + queryParams.QuestionId +
                  (!queryParams.IncludeCDNs.IsNullOrEmpty() ? "AND CDN IN (" + queryParams.IncludeCDNs.ToDelimitedString(", ") + ") " : "") +
                  (!queryParams.ExcludeCDNs.IsNullOrEmpty() ? "AND CDN NOT IN (" + queryParams.ExcludeCDNs.ToDelimitedString(", ") + ") " : "") +
                  (!queryParams.AgentIds.IsNullOrEmpty() ? " AND AGENT_ID IN (" + queryParams.AgentIds.ToDelimitedString(", ") + ") " : "") +
                  (!queryParams.TeamIds.IsNullOrEmpty() ? " AND TEAM_ID IN (" + queryParams.TeamIds.ToDelimitedString(", ") + ") " : "") +
              "GROUP BY " +
                  "SPØRGSMÅL_ID, " +
                  "KARAKTER";