【问题标题】:Two Subquery-Select Tables Resulting In Same Data产生相同数据的两个子查询-选择表
【发布时间】:2017-05-03 21:00:29
【问题描述】:

使用 SQL Server Management Studio 2016。

当我执行以下查询时,SUM(COLUMN_D) 和 SUM(COLUMN_E) 显示相同的结果。但是,列 D (TBL_1) 的子查询表使用的信息与列 E (TBL_2) 的子查询表不同。

   SELECT EMPLOYEE, TBL_1.STATE, EMP.NAME, SUM(COLUMN_D) 'Column D', SUM(COLUMN_E) 'Column E'
   FROM
   (
       SELECT T1.*, T2.STATE
       FROM
           (
            SELECT DISTINCT EMPLOYEE, ACCOUNT, MAX(DATE) 'Date', 1 'COLUMN_D'
            FROM TRANSACTION
            GROUP BY EMPLOYEE, ACCOUNT
           ) T1
           LEFT JOIN LOCATION T2 ON T2.ACCOUNT=T1.ACCOUNT
           )TBL_1 

           JOIN
    (
        SELECT TT1.*,TT2.STATE
        FROM
            (
             SELECT DISTINCT ACCOUNT, PROVIDER, MAX(JOB_TITLE) 'Job', 1 'COLUMN_E'
             FROM EMPLOYEE_LIST
             GROUP BY ACCOUNT, PROVIDER
             )TT1
             LEFT JOIN LOCATION TT2 ON TT2.ACCOUNT=TT1.ACCOUNT
             )TBL_2 on TBL_2.ACCOUNT=TBL_1.ACCOUNT
    join EMPLOYER EMP on EMP.EMPID=TBL_1.EMPLOYEE and EMP.EMPID=TBL_2.PROVIDER
    WHERE TBL1.STATE IS NOT NULL
    GROUP BY EMPLOYEE, TBL_1.STATE, EMP.NAME
    ORDER BY EMPLOYEE, EMP.NAME

执行时,结果如下所示: Results

TBL_1 的 TRANSACTION 表显示事务数; TBL_1 和 TBL_2 的 LOCATION 表显示了不同的位置; TBL_2 的 EMPLOYEE_LIST 表显示员工列表和工作负载(例如,员工 A 的工作负载为 40,但只有 10 个事务); EMPLOYER 表显示更多详细信息,例如 EMPLOYEE 的全名。

因此,结果应如下所示: Should Look Like

我如何将 TBL_2 加入到 TBL_1 是否导致 COLUMN_D 和 COLUMN_E 的数字相同?

示例数据:交易

    EMPLOYEE   ACCOUNT   DATE                       BILLED   CHGAMOUNT
    XAC425     100001    2017-03-14 00:00:00.000    B        200.05
    XAC468     100001    2017-03-10 00:00:00.000    B        158.69
    XAC468     100002    2017-03-07 00:00:00.000    B        10.23
    XAC499     100003    2017-03-07 00:00:00.000    B        30.99
    XAC499     100004    2017-03-25 00:00:00.000    B        25.99
    XAC499     100005    2017-03-10 00:00:00.000    B        101.22
    XAC499     100002    2017-03-07 00:00:00.000    B        105.89

示例数据:位置

    EMPLOYEE   ACCOUNT   STATE        ACTIVE 
    XAC425     100001    CALIFORNIA   Y    
    XAC468     100001    UTAH         Y   
    XAC468     100002    UTAH         Y   
    XAC499     100003    ARIZONA      Y      
    XAC499     100004    ARIZONA      Y      
    XAC499     100005    ARIZONA      Y    
    XAC499     100002    ARIZONA      Y     

示例数据:EMPLOYEE_LIST

    PROVIDER   ACCOUNT   JOB TITLE LEVEL   
    XAC425     100001    WORKER    1       
    XAC468     100001    WORKER    1       
    XAC468     100002    WORKER    1       
    XAC499     100003    MANAGER   2            
    XAC499     100004    MANAGER   2
    XAC499     100005    MANAGER   2
    XAC499     100002    MANAGER   2

样本数据:雇主

    EMPID     NAME           Address            City     State  Zip
    XAC425    John Smith     123 Walnut Street  Irving   CA     90265
    XAC468    Kerry Wong     456 North Road     Chicago  IL     60658  
    XAC499    Tim Jones      12 Post Road       New York NY     00014      
    XAC500    Todd Bullock   1234 18th Street   Tucson   AZ     56586 

【问题讨论】:

  • 只是为了澄清这个请求,我基本上是在尝试显示基于 TBL_1 的 COLUMN D 中的数据和基于公共字段的来自 COLUMN E 基础 don TBL_2 的不同数据集:EMPLOYEE、ACCOUNT、和状态。

标签: sql sql-server join subquery


【解决方案1】:

您缺少中间层(子查询的第一层)的别名。请尝试以下操作:

SELECT EMPLOYEE, TBL_1.STATE, EMP.NAME, SUM(COLUMN_D) 'Column D', SUM(COLUMN_E) 'Column E'
   FROM
   (
       SELECT EMPLOYEE, ACCOUNT, [Date], COLUMN_D, T2.STATE
       FROM
           (
            SELECT DISTINCT EMPLOYEE, ACCOUNT, MAX(DATE) 'Date', 1 'COLUMN_D'
            FROM TRANSACTION
            GROUP BY EMPLOYEE, ACCOUNT
           ) T1
           LEFT JOIN LOCATION T2 ON T2.ACCOUNT=T1.ACCOUNT
           )TBL_1 

           JOIN
    (
        SELECT ACCOUNT, PROVIDER,  Job, COLUMN_E,TT2.STATE
        FROM
            (
             SELECT DISTINCT ACCOUNT, PROVIDER, MAX(JOB_TITLE) 'Job', 1 'COLUMN_E'
             FROM EMPLOYEE_LIST
             GROUP BY ACCOUNT, PROVIDER
             )TT1
             LEFT JOIN LOCATION TT2 ON TT2.ACCOUNT=TT1.ACCOUNT
             )TBL_2 on TBL_2.ACCOUNT=TBL_1.ACCOUNT
    join EMPLOYER EMP on EMP.EMPID=TBL_1.EMPLOYEE and EMP.EMPID=TBL_2.PROVIDER
    WHERE TBL1.STATE IS NOT NULL
    GROUP BY EMPLOYEE, TBL_1.STATE, EMP.NAME
    ORDER BY EMPLOYEE, EMP.NAME

【讨论】:

  • 感谢您的回答。我得到了和以前一样的结果。
  • @Bryant 你能发布一些示例数据吗?
  • 感谢您的帮助。我添加了一些示例表,我希望它们就足够了。在解释时,我可能会让这个问题变得更加困难。由于查询是使用两个不同的子查询表 (TBL_1) 和 (TBL_2) 设置的,因此 COLUMN D 和 COLUMN E 的计数不应相等。他们应该产生不同的计数。这是我无法正常工作的查询部分。这可能是因为我的加入。 TBL_1 和 TBL_2 都在查看不同的子查询。但是,结果显示两者的数字相同,这是不对的。
  • 我看了这个,现在更懵了。让我们再试一次。您能否提供以下内容:英文句子(非技术性谈话),描述您希望结果中的每一行包含的内容。
猜你喜欢
  • 1970-01-01
  • 2013-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多