我想在底行获取一列的总和。 我通过使用SUM()和COUNT()尝试了一些示例,但它们都因语法错误而失败。
这是我目前的代码,没有任何总和或任何东西:
:XML ON
USE MYTABLE
SELECT sbc.PolicyC.PolicyName as namn,COUNT(*) as cnt
FROM sbc.AgentC, sbc.PolicyC
WHERE sbc.AgentC.PolicyGuid = sbc.PolicyC.PolicyGuid
GROUP BY sbc.AgentC.PolicyGuid, sbc.PolicyC.PolicyName ORDER BY namn ASC
FOR XML PATH ('celler'), ROOT('root')
GO
重新格式化XML输出以成为常规HTML表。
修改
这是最新的代码,但它会在每隔一行产生一个“sum”(与上面一行相同的数字):
:XML ON
USE MYTABLE
SELECT sbc.PolicyC.PolicyName as namn,COUNT(*) as cnt
FROM sbc.AgentC, sbc.PolicyC
WHERE sbc.AgentC.PolicyGuid = sbc.PolicyC.PolicyGuid
GROUP BY sbc.AgentC.PolicyGuid, sbc.PolicyC.PolicyName with rollup
FOR XML PATH ('celler'), ROOT('root')
GO
XML输出如下所示:
<root>
<celler>
<namn>example name one</namn>
<cnt>23</cnt>
</celler>
<celler>
<cnt>23</cnt>
</celler>
<celler>
<namn>example name two</namn>
<cnt>1</cnt>
</celler>
<celler>
<cnt>1</cnt>
</celler>
</root>
答案 0 :(得分:1)
尝试
SELECT sbc.PolicyC.PolicyName as namn,COUNT(*) as cnt
FROM sbc.AgentC, sbc.PolicyC
WHERE sbc.AgentC.PolicyGuid = sbc.PolicyC.PolicyGuid
GROUP BY sbc.AgentC.PolicyGuid, sbc.PolicyC.PolicyName
UNION
SELECT 'TOTAL' as nawn,COUNT(*) as cnt
FROM
FROM sbc.AgentC, sbc.PolicyC
WHERE sbc.AgentC.PolicyGuid = sbc.PolicyC.PolicyGuid
ORDER BY namn ASC
这将计算单独查询中的总计。但是,您可能需要添加一些非打印,高ASCII字符以强制总计到底部,或者添加一些数字排序键... mySQL也可能有一个运算符(类似于Microsoft SQL中的WITH ROLLUP)会比上面的代码更有效......所以虽然这样可行,但可能有更高效的选择...
答案 1 :(得分:1)
MySQL支持rollup extension分组。
select * from parts;
+-----------+--------+
| part_name | amount |
+-----------+--------+
| upper | 100 |
| lower | 100 |
| left | 50 |
| right | 50 |
+-----------+--------+
select part_name
,sum(amount)
from parts
group
by part_name with rollup;
+-----------+-------------+
| part_name | sum(amount) |
+-----------+-------------+
| left | 50 |
| lower | 100 |
| right | 50 |
| upper | 100 |
| NULL | 300 |
+-----------+-------------+
已更新以回复评论:
以下项目列出了一些 特定于MySQL的行为 ROLLUP的实现:
当您使用ROLLUP时,您也不能 使用ORDER BY子句对其进行排序 结果。换句话说,ROLLUP和 ORDER BY是互斥的。 但是,你仍然有一些控制权 超过排序顺序。 MySQL中的GROUP BY 对结果进行排序,您可以使用 显式ASC和DESC关键字 GROUP BY列表中指定的列 指定个人的排序顺序 列。 (更高级别的摘要 ROLLUP添加的行仍然出现 在它们所在的行之后 计算,不管是哪种 为了。)
答案 2 :(得分:1)
我的代码变得像这样:
SELECT * FROM (...old code here... UNION ...'Total:' ... COUNT() ...)* z
ORDER BY CASE WHEN z.Namn = 'Total:' THEN '2' ELSE '1' END , z.Antal DESC
我有一列名为Namn的列和一列名为Antal的列。 如果在Namn列中有值'Total:',它将以'2'排序,如果不是'1',则当我对Antal进行排序时,会使'Total:'移到底部。列。
魔术之所以发生是因为表中的“总计:”是UNION,然后末尾的CASE语句将其放在末尾。
我的完整代码对我来说很杂乱,它也结合了2个表和其他东西:
SELECT * FROM (
SELECT acrclient.Client_Name AS 'Namn', COUNT(x.client) AS 'Antal'
FROM
(SELECT 'B' tab,t.client
FROM asutrans t
where t.voucher_type!='IP' AND t.last_update >= {ts '2019-01-01 00:00:00'}
UNION ALL SELECT
'C' tab,t.client
FROM asuhistr t
WHERE t.voucher_type!='IP' AND t.last_update >= {ts '2019-01-01 00:00:00'} ) x
LEFT JOIN acrclient ON x.client = acrclient.client
GROUP BY x.client, acrclient.Client_Name
UNION ALL
SELECT 'Total:', COUNT(client) FROM (SELECT 'B' tab,t.client
FROM asutrans t
where t.voucher_type!='IP' AND t.last_update >= {ts '2019-01-01 00:00:00'}
UNION ALL SELECT
'C' tab,t.client
FROM asuhistr t
WHERE t.voucher_type!='IP' AND t.last_update >= {ts '2019-01-01 00:00:00'} ) y
) z
ORDER BY CASE WHEN z.Namn = 'Total:' THEN '2' ELSE '1' END , z.Antal DESC