基于SQL Server中的列进行计数

亚武兹

我有3张桌子:

SELECT ID,字母FROM

+--------+--------+
|     id | letter |
+--------+--------+
|      1 | A      |
|      2 | B      |
+--------+--------+

SELECT ID,X的字母

+--------+------------+
|     id |   letter   |
+--------+------------+
|      1 | X          |
|      2 | Y          |
|      3 | Z          |
+--------+------------+ 

SELECT id,As_id,Xs_id来自A_X

+--------+-------+-------+
|     id | As_id | Xs_id |
+--------+-------+-------+
|      9 |     1 |     1 |
|     10 |     1 |     2 |
|     11 |     2 |     3 |
|     12 |     1 |     2 |
|     13 |     2 |     3 |
|     14 |     1 |     1 |
+--------+-------+-------+

我可以用group by来计算所有的As和B。但是我想根据X,Y和Z来计算As和Bs。我想要得到的如下:

+-------+
| X,Y,Z |
+-------+
| 2,2,0 |
| 0,0,2 |
+-------+

  X,Y,Z
A 2,2,0
B 0,0,2

在MSSQL上执行此操作的最佳方法是什么?例如,使用foreach是否有效?

编辑:这不是重复的,因为我只是想知道有效的方法而已

木星东

对于您不知道当前代码效率低下的原因(因为未提供任何效率)而尝试做的事情,Pivot是最好的。在线有上百万种资源,您可以在堆栈溢出问答论坛中找到所需的资源。这可能是对Pivot的最简单的解释,我经常需要提醒自己有关枢轴的复杂语法。

为了专门回答您的问题,这是显示上面链接如何应用于您的问题的代码

需要创建第一个表

DECLARE @AS AS TABLE (ID INT, LETTER VARCHAR(1))
DECLARE @XS AS TABLE (ID INT, LETTER VARCHAR(1))
DECLARE @XA AS TABLE (ID INT, AsID INT, XsID INT)

值已添加到表中

INSERT INTO @AS (ID, Letter)
SELECT 1,'A'
UNION   
SELECT 2,'B'


INSERT INTO @XS (ID, Letter)
SELECT 1,'X'
UNION   
SELECT 2,'Y'
UNION   
SELECT 3,'Z'

INSERT INTO @XA (ID, ASID, XSID)
SELECT 9,1,1
UNION
SELECT 10,1,2
UNION
SELECT 11,2,3
UNION
SELECT 12,1,2
UNION
SELECT 13,2,3
UNION
SELECT 14,1,1

然后构造执行枢轴的查询:

SELECT   LetterA, [X],[Y],[Z]
  FROM  (SELECT  A.LETTER AS LetterA
                ,B.LETTER AS LetterX
                ,C.ID
          FROM   @XA C
          JOIN   @AS A
            ON   A.ID = C.ASID
          JOIN   @XS B
            ON   B.ID = C.XSID
        ) Src
 PIVOT  (COUNT(ID)
   FOR   LetterX IN ([X],[Y],[Z])
        ) AS PVT

执行后,结果如下:

Letter  X   Y   Z
A       2   2   0
B       0   0   2

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章