我有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] 删除。
我来说两句