计算来自多个表的数据

时间:2014-04-22 08:40:04

标签: asp.net sql sql-server grouping

我有3张桌子T1,T2,T3。 他们每个人都与另一个人有关系。

enter image description here

enter image description here

enter image description here

SELECT     T1.T1_Serno, T2.T2_Serno, T3.T3_Serno, T1.T1,COUNT( T3.T3_Serno) as Count_1, T2.T2, T3.T3, T3.Quantity
FROM         T1 INNER JOIN
                      T2 ON T1.T1_Serno = T2.T1_Serno INNER JOIN
                      T3 ON T2.T2_Serno = T3.T2_Serno
GROUP BY T1.T1_Serno, T2.T2_Serno, T3.T3_Serno, T1.T1, T2.T2, T3.T3, T3.Quantity

,结果是

enter image description here

我希望让Count_1向我显示有多少T3,而Count_2有相对的T3数量。 我期待像

这样的结果
   T2    T3      Count_1 Count_2
    Apple Apple1    3    80
    Apple Apple2    3    80
    Apple Apple3    3    80
    -------
    Google Google1  1    40
    ------
    Nokia Nokia1    1    15

因此,当我把它放在网格中时,我可以使用Counts作为页脚。 这样的事情,但每个集团下面的总数。

enter image description here

1 个答案:

答案 0 :(得分:7)

SELECT t2.t2,t3.t3,sum(t3.Quantity)
FROM T2 AS T2
INNER JOIN T3 AS T3 ON t3.t2_serno = t2.t2_serno
GROUP BY t2.t2,t3.t3

实质上,您希望通过1个主要分组(t2)和1个次要分组(t3)对事物进行分组。因此,当您执行sql server group by时,它会在分组中创建分组(如果您有多个分组元素)。最左边的分组元素将是主要分组,从左到右的读数将是子分组。这就是我GROUP By t2.t2,t3.t3的方式。

一旦我理解了你想要它如何分组,我就看了一下列数量。您想要t3中数量列的总和。由于t3.t3是t2.t2的子组,因此sql server将列聚合应用于t3.t3子组的所有行,该子组已经由t2.t2分组分组。

<强> TL; DR : sql server中的group by子句从左到右具有前导,在分组中创建分组。如果将聚合应用于子组中的列,则聚合将神奇地(非常逻辑地,如果您了解sql引擎)适用于子组中的每个项目,并从每个新子组实例开始。