簡體   English   中英

底行的 SQL 查詢總和

[英]SQL query sum at bottom row

我試圖在底行獲得一列的總和。 我已經使用 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 表。

編輯:

這是最新的代碼,但它每隔一行生成一個“總和”(與上面的行相同):

: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>

試試

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)會比上面的代碼更有效......所以雖然這會起作用,但可能有更有效的選項可供您使用......

MySQL 支持 匯總擴展以分組。

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 對結果進行排序,您可以對 GROUP BY 列表中命名的列使用顯式 ASC 和 DESC 關鍵字來指定各個列的排序順序。 不管排序順序如何,ROLLUP 添加的更高級別的匯總行仍然出現在計算它們的行之后。)

我的代碼變成了這樣:

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:' 移動到底部列。

神奇的事情發生了,因為“總計:”是與表的聯合,然后最后的 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM