底行的SQL查询和

时间:2011-01-04 08:54:42

标签: sql

我想在底行获取一列的总和。 我通过使用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>

3 个答案:

答案 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