Jom*_*per 10 mysql join group-by sum
我有连接表的问题,这里是示例表:
表A:(30行)
????????????????????????????????? ? ID ? Name ? Description ? ????????????????????????????????? ? 1 ? Type ? Unicode Art ? ? 2 ? Header ? Spreadsheet ? ? 3 ? Auto Align ? Off ? ?????????????????????????????????
表B:(100行)
??????????????????????????????????????????? ? ID ? Name ? Description ? TableA ? ??????????????????????????????????????????? ? 1 ? Type ? Unicode Art ? 1 ? ? 2 ? Header ? Spreadsheet ? 1 ? ? 3 ? Auto Align ? Off ? 2 ? ???????????????????????????????????????????
表C :( 8000行)
??????????????????????????????????????????? ? ID ? Article ? Text ? TableB ? ??????????????????????????????????????????? ? 1 ? Type ? Unicode Art ? 1 ? ? 2 ? Header ? Spreadsheet ? 1 ? ? 3 ? Auto Align ? Off ? 2 ? ???????????????????????????????????????????
表D :( 100 000行和计数)
??????????????????????????????????????????????????????? ? ID ? Date ? Clicks ? Impressions ? TableC ? ??????????????????????????????????????????????????????? ? 1 ? 20120814 ? 10 ? 3 ? 1 ? ? 2 ? 20120815 ? 13 ? 5 ? 1 ? ? 3 ? 20120816 ? 15 ? 10 ? 2 ? ???????????????????????????????????????????????????????
表E :( 200 000行和计数)
????????????????????????????????????????????????????? ? ID ? Date ? Views ? Visitors ? TableC ? ????????????????????????????????????????????????????? ? 1 ? 20120814 ? 10 ? 3 ? 1 ? ? 2 ? 20120815 ? 13 ? 5 ? 1 ? ? 3 ? 20120816 ? 15 ? 10 ? 2 ? ? 4 ? 20120817 ? 8 ? 7 ? 2 ? ? 5 ? 20120818 ? 9 ? 4 ? 2 ? ?????????????????????????????????????????????????????
我用单个sql语句查询这个表:
SELECT
A.name,
A.Description,
SUM(D.clicks),
SUM(D.Impressions),
SUM(E.Views),
SUM(E.Visitors)
FROM
A
LEFT JOIN B
ON A.ID=B.TableA
LEFT JOIN C
ON B.ID=C.TableB
LEFT JOIN D
ON C.ID=D.TableC
LEFT JOIN E
ON C.ID=E.TableC
GROUP BY
A.ID
问题是查询返回表D和表E的无效SUM
但是如果在查询表D和表E的情况下我得到了正确的值:
SELECT
A.name,
A.Description,
SUM(D.clicks),
SUM(D.Impressions)
FROM
A
LEFT JOIN B
ON A.ID=B.TableA
LEFT JOIN C
ON B.ID=C.TableB
LEFT JOIN D
ON C.ID=D.TableC
GROUP BY
A.ID
编辑1:
我尝试过RIGHT JOIN,JOIN,LEFT OUTER JOIN他们都没有工作,
当然我可能会在错误的地方使用它们.
但是在我得到"全部包含"的第一个声明中,它们的倍数
比实际值高出许多千倍.
你需要弄平D和E表.然后我想A和B只是C的查找,因此不需要在A上进行GROUP BY:http://www.sqlfiddle.com/#!2/fccf1 / 8
我删除了噪音(A和B),因为我看不到(还有)A和B如何与总结C的信息有关
试试这个:
SELECT
C.Article,
C.Text,
COALESCE(D.ClicksSum,0) AS ClicksSum,
COALESCE(D.ImpressionsSum,0) AS ImpressionsSum,
COALESCE(E.ViewsSum,0) AS ViewsSum,
COALESCE(E.VisitorsSum,0) AS VisitorsSum
FROM
C
LEFT JOIN
(
SELECT TableC, SUM(Clicks) AS ClicksSum, SUM(Impressions) AS ImpressionsSum
FROM D
GROUP BY TableC
) D ON C.ID=D.TableC
LEFT JOIN
(
SELECT TableC, SUM(Views) AS ViewsSum, SUM(Visitors) AS VisitorsSum
FROM E
GROUP BY TableC
) E ON C.ID=E.TableC
Run Code Online (Sandbox Code Playgroud)
输出:
| ARTICLE | TEXT | CLICKSSUM | IMPRESSIONSSUM | VIEWSSUM | VISITORSSUM |
----------------------------------------------------------------------------------
| Type | Unicode Art | 23 | 8 | 23 | 8 |
| Header | Spreadsheet | 15 | 10 | 32 | 21 |
| Auto Align | Off | 0 | 0 | 0 | 0 |
Run Code Online (Sandbox Code Playgroud)
请注意,我没有手动在我的sqlfiddle帖子中键入这些模式,我使用sqlfiddle的文本到DDL
我喜欢http://sqlfiddle.com,它的文本到DDL甚至可以解析你的ASCII艺术ツ中的数据
在看到更明确的目标(来自您的评论)后,可能是:http://www.sqlfiddle.com/#!2/fccf1/13
SELECT
A.Name, A.Description,
COALESCE(SUM(D.ClicksSum),0) AS ClicksSum,
COALESCE(SUM(D.ImpressionsSum),0) AS ImpressionsSum,
COALESCE(SUM(E.ViewsSum),0) AS ViewsSum,
COALESCE(SUM(E.VisitorsSum),0) AS VisitorsSum
FROM
C
LEFT JOIN
(
SELECT TableC, SUM(Clicks) AS ClicksSum, SUM(Impressions) AS ImpressionsSum
FROM D
GROUP BY TableC
) D ON C.ID=D.TableC
LEFT JOIN
(
SELECT TableC, SUM(Views) AS ViewsSum, SUM(Visitors) AS VisitorsSum
FROM E
GROUP BY TableC
) E ON C.ID=E.TableC
RIGHT JOIN B ON B.ID = C.TableB
RIGHT JOIN A ON A.ID = B.TableA
GROUP BY A.ID
Run Code Online (Sandbox Code Playgroud)
输出:
| NAME | DESCRIPTION | CLICKSSUM | IMPRESSIONSSUM | VIEWSSUM | VISITORSSUM |
----------------------------------------------------------------------------------
| Type | Unicode Art | 38 | 18 | 55 | 29 |
| Header | Spreadsheet | 0 | 0 | 0 | 0 |
| Auto Align | Off | 0 | 0 | 0 | 0 |
Run Code Online (Sandbox Code Playgroud)
上述方法可能仍会生产笛卡尔产品,在将其分类为类别(A)之前将子类别(B)展平:http://www.sqlfiddle.com/#!2/fccf1 / 19
SELECT
A.Name, A.Description,
COALESCE(SUM(B.ClicksSum),0) AS ClicksSum,
COALESCE(SUM(B.ImpressionsSum),0) AS ImpressionsSum,
COALESCE(SUM(B.ViewsSum),0) AS ViewsSum,
COALESCE(SUM(B.VisitorsSum),0) AS VisitorsSum
FROM A
LEFT JOIN
(
SELECT
B.ID, B.TableA,
SUM(C.ClicksSum) AS ClicksSum,
SUM(C.ImpressionsSum) AS ImpressionsSum,
SUM(C.ViewsSum) AS ViewsSum,
SUM(C.VisitorsSum) AS VisitorsSum
FROM B
LEFT JOIN
(
SELECT
C.TableB,
D.ClicksSum,
D.ImpressionsSum,
E.ViewsSum,
E.VisitorsSum
FROM
C
LEFT JOIN
(
SELECT TableC, SUM(Clicks) AS ClicksSum, SUM(Impressions) AS ImpressionsSum
FROM D
GROUP BY TableC
) D ON C.ID=D.TableC
LEFT JOIN
(
SELECT TableC, SUM(Views) AS ViewsSum, SUM(Visitors) AS VisitorsSum
FROM E
GROUP BY TableC
) E ON C.ID=E.TableC
) C ON C.TableB = B.ID
GROUP BY B.ID
) B ON B.TableA = A.ID
GROUP BY A.ID
Run Code Online (Sandbox Code Playgroud)
输出:
| NAME | DESCRIPTION | CLICKSSUM | IMPRESSIONSSUM | VIEWSSUM | VISITORSSUM |
----------------------------------------------------------------------------------
| Type | Unicode Art | 38 | 18 | 55 | 29 |
| Header | Spreadsheet | 0 | 0 | 0 | 0 |
| Auto Align | Off | 0 | 0 | 0 | 0 |
Run Code Online (Sandbox Code Playgroud)