如何在SQL Server 2012中连接三个表并根据2个属性计算排名

时间:2018-01-16 15:38:53

标签: sql sql-server sql-server-2012

我有3张桌子:

tblEmployee

E_ID    E_Name  E_City
--------------------------------
101     sasa    Mumbai
102     sdf     California
103     trt     Illinois
104     dssd    Texas
105     trt     Pennsylvania
106     wee     Arizona
107     rer     Texas
108     wqe     California
109     sadd    Michigan

tblGen

Tgenerate是布尔值

  Emp_ID    Tgenerate
  --------------------
    105     1
    108     1
    102     1
    102     1
    102     0
    104     1
    107     0
    108     1
    109     0

tblStat

Emp_ID  Status
------------------
103     Pending
107     Pending
103     Pending
101     Delivered
104     Pending
104     Pending
108     Pending
101     Delivered
105     Delivered

我必须加入这3个表并希望像这样输出

E_Name  EmployeeID  City    TgenerateCount  Delivered_Count     Ranking
为每位员工计算

TgenerateCount。它是TgenerateCount的值为1,因为ex 102有2个TgenerateCount而109有0个TgenerateCount。

Delivered_Count是已经交付的人数的状态计数'状态。对于前者101已交付2。我想在输出表中显示每个用户。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

由于您的两个事实表与维度表有很多:1关系,因此您应该在加入它们之前将它们聚合在一起。

SELECT
  e.*,
  COALESCE(g.rows, 0)     AS TgenerateCount,
  COALESCE(s.rows, 0)     AS DeliveredCount,
  RANK() OVER (ORDER BY COALESCE(g.rows, 0) + COALESCE(s.rows,0) DESC)   AS ranking
FROM
  tblEmployee     e
LEFT JOIN
(
  SELECT E_ID, COUNT(*) AS rows FROM tblGen WHERE Tgenerate = 1 GROUP BY E_ID
)
  g
    ON g.E_ID = e.E_ID
LEFT JOIN
(
  SELECT E_ID, COUNT(*) AS rows FROM tblStat WHERE STATUS = 'Delivered' GROUP BY E_ID
)
  s
    ON s.E_ID = e.E_ID

你一直不清楚应该如何完成排名,所以这只是给出一个例子排名。