T-SQL - 多个 WITH 子句然后 SUM 总计
T-SQL - Multiple WITH clause and then SUM total
我正在使用 T-SQL 并旨在使用三个 WITH 子句收集到我的主要 table 查询中。如果我 运行 每个 WITH 查询自己,我可以得到想要的结果。但是当将它混合到我的主要 table 查询中时,没有显示任何结果。我认为我的 WITH 子句没问题,但我的主要 table 查询没有得到想要的结果。
非常感谢任何帮助。
WITH n1 AS (SELECT m.name AS n1nom, SUM(y.Column1) AS SomeTotal1
FROM Mees m
INNER JOIN Listy y
ON y.m1=m.name
WHERE Yr=2020
GROUP BY m.name)
,
n2 AS (SELECT m.name AS n2nom, SUM(y.Column1) AS SomeTotal2
FROM Mees m
INNER JOIN Listy y
ON y.m2=m.name
WHERE Yr=2020
GROUP BY m.name)
,
n3 AS (SELECT m.name AS n3nom, SUM(y.Column1) AS SomeTotal3
FROM Mees m
INNER JOIN Listy y
ON y.m3=m.name
WHERE Yr=2020
GROUP BY m.name)
SELECT m.name, SUM(n1.sometotal1 + n2.sometotal2 + n3.sometotal3) AS Cool
FROM Mees M
INNER JOIN n1
ON n1.n1nom=m.name
INNER JOIN n2
ON n2.n2nom=m.name
INNER JOIN n3
ON n3.n3nom=m.name
GROUP BY m.name, n1.sometotal1 + n2.sometotal2 + n3.sometotal3;
如果当 m.name
匹配 y.m1
、y.m2
和 y.m3
中的任何一个时,您想要 y.Column1
的总数,那么您只需要 1 个连接和聚合:
SELECT m.name, SUM(y.Column1) AS Total
FROM Mees m
INNER JOIN Listy y
ON m.name IN (y.m1, y.m2, y.m3)
WHERE Yr = 2020
GROUP BY m.name
如果您想多次添加 y.Column1
以防 y.m1
、y.m2
和 y.m3
中有超过 1 个与 m.name
匹配,则使用 CASE
里面的表达式 SUM()
:
SELECT m.name,
SUM(
(
CASE WHEN m.name = y.m1 THEN 1 ELSE 0 END +
CASE WHEN m.name = y.m2 THEN 1 ELSE 0 END +
CASE WHEN m.name = y.m3 THEN 1 ELSE 0 END
) * y.Column1
) AS Total
FROM Mees m
INNER JOIN Listy y
ON m.name IN (y.m1, y.m2, y.m3)
WHERE Yr = 2020
GROUP BY m.name
我正在使用 T-SQL 并旨在使用三个 WITH 子句收集到我的主要 table 查询中。如果我 运行 每个 WITH 查询自己,我可以得到想要的结果。但是当将它混合到我的主要 table 查询中时,没有显示任何结果。我认为我的 WITH 子句没问题,但我的主要 table 查询没有得到想要的结果。
非常感谢任何帮助。
WITH n1 AS (SELECT m.name AS n1nom, SUM(y.Column1) AS SomeTotal1
FROM Mees m
INNER JOIN Listy y
ON y.m1=m.name
WHERE Yr=2020
GROUP BY m.name)
,
n2 AS (SELECT m.name AS n2nom, SUM(y.Column1) AS SomeTotal2
FROM Mees m
INNER JOIN Listy y
ON y.m2=m.name
WHERE Yr=2020
GROUP BY m.name)
,
n3 AS (SELECT m.name AS n3nom, SUM(y.Column1) AS SomeTotal3
FROM Mees m
INNER JOIN Listy y
ON y.m3=m.name
WHERE Yr=2020
GROUP BY m.name)
SELECT m.name, SUM(n1.sometotal1 + n2.sometotal2 + n3.sometotal3) AS Cool
FROM Mees M
INNER JOIN n1
ON n1.n1nom=m.name
INNER JOIN n2
ON n2.n2nom=m.name
INNER JOIN n3
ON n3.n3nom=m.name
GROUP BY m.name, n1.sometotal1 + n2.sometotal2 + n3.sometotal3;
如果当 m.name
匹配 y.m1
、y.m2
和 y.m3
中的任何一个时,您想要 y.Column1
的总数,那么您只需要 1 个连接和聚合:
SELECT m.name, SUM(y.Column1) AS Total
FROM Mees m
INNER JOIN Listy y
ON m.name IN (y.m1, y.m2, y.m3)
WHERE Yr = 2020
GROUP BY m.name
如果您想多次添加 y.Column1
以防 y.m1
、y.m2
和 y.m3
中有超过 1 个与 m.name
匹配,则使用 CASE
里面的表达式 SUM()
:
SELECT m.name,
SUM(
(
CASE WHEN m.name = y.m1 THEN 1 ELSE 0 END +
CASE WHEN m.name = y.m2 THEN 1 ELSE 0 END +
CASE WHEN m.name = y.m3 THEN 1 ELSE 0 END
) * y.Column1
) AS Total
FROM Mees m
INNER JOIN Listy y
ON m.name IN (y.m1, y.m2, y.m3)
WHERE Yr = 2020
GROUP BY m.name