【问题标题】:Inner join with 3 tables and 2 sum groups与 3 个表和 2 个总和组的内部连接
【发布时间】:2015-03-10 03:52:25
【问题描述】:

我有 3 张桌子; COMPANYTRAINING TICKETTEST

COMPANY表:

 COMPANY CODE | COMPANY NAME
 192            ABC ENTERPRISE
 299            XYZ ENTERPRISE

TRAINING TICKET表:

 TICKET ID | COMPANY CODE | START DATE
 2900            192           2015-02-02
 3939            192           2015-03-03
 4399            299           2015-03-02

TEST SESSION表:

 TEST CODE | TICKET ID | COMPANY CODE | CERTIFIED
 1221        2900            192            YES
 2821        3939            192            NULL
 3922        4399            299            YES

我需要这样的东西:

 C. CODE | COMPANY NAME | 1ST START DATE | TRAINING TICKET TOTAL | CERTIFIED TOTAL
 192      ABC ENTERPRISE  2015-02-02             2                1
 299      XYZ ENTERPRISE  2015-03-02             1                1 

有可能吗?

我的Sql指令是:

Select *, count(TICKET.CCODE) AS TICKET_TOTAL, count(TEST.CODE) AS CERT_TOTAL
from TICKET 
Inner Join COMPANY on TICKET.CCODE = COMPANY.CCODE 
Inner Join TEST on COMPANY.CCODE = TEST.CCODE 
Group by (TICKET.CCODE),(TEST.CCODE)
Order by TICKET_TOTAL DESC

但两个计数始终相等(TICKET_TOTAL 和 CERT_TOTAL 的结果相同)并且总和是错误的 - 结果是 TICKET_TOTAL = 21 和 CERT_TOTAL = 28,但我得到 523 - 对于 TOP 1 公司。

【问题讨论】:

  • 普遍接受的做法是展示你迄今为止所做的尝试,表明你已经为这个问题付出了一些努力。
  • @thecoshman 对我来说最大的问题在于第二组总和。我简化了表格,但是公司的第一个总和是 28,第二个总和是 21。我可以毫无问题地完成第一个总和(3 个内部连接 ​​+ 1 个组总和)-第二组我得到了一些疯狂的结果,比如 523..并且两个计数始终相等。选择 *, count(TICKET.CCODE) AS TICKET_TOTAL, count(TEST.CODE) AS CERT_TOTAL from TICKET INNER JOIN COMPANY ON TICKET.CCODE = COMPANY.CCODE INNER JOIN TEST ON COMPANY.CCODE = TEST.CCODE Group by (TICKET.CCODE ),(TEST.CCODE) ORDER BY TICKET_TOTAL DESC

标签: session


【解决方案1】:

我得到了答案:

Select COMPANY.CODE, COMPANY.NAME, 
MIN(TICKET.STARTDATE), count(TICKET.TICKETID) AS TICKET_TOTAL, 
count(TEST.CERTIFIED) AS CERT_TOTAL
    from COMPANY
    INNER JOIN TICKET ON COMPANY.CODE = TICKET.CCODE 
    LEFT JOIN TEST ON TICKET.TICKETID = TEST.TICKET
    Group by (TICKET.CCODE)
    ORDER BY TICKET_TOTAL DESC 

1- 对 COMPANY TABLE 中的指令重新排序并加注星标

2- MIN(TICKET.STARTDATE) 获取第一个开始日期(如有必要,使用 MAX 获取最后一个开始日期)

3- 将Inner Join 改为Left Join(因为有些公司在ticket table 上有ticket,但在test table 上没有test)

希望这可以帮助将来的人!

【讨论】:

    猜你喜欢
    • 2016-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-31
    • 2018-03-05
    • 2020-07-15
    • 1970-01-01
    • 2015-07-24
    相关资源
    最近更新 更多