![](/img/trans.png)
[英]How to select only customer data and sum of that at bottom of table as row using sql query?
[英]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.