我有一個看起來像這樣的表:
| 城市 ID | 城市 |
|---|---|
| 41 | 雅典娜 |
| 39 | 北京 |
| 35 | 倫敦 |
| 30 | 里約熱內盧 |
| 28 | 鹽湖城 |
| 18 | 索契 |
| 7 | 悉尼 |
| 4 | 都靈 |
有沒有辦法在底部顯示另一行來顯示總行數?
| 城市 ID | 城市 |
|---|---|
| 41 | 雅典娜 |
| 39 | 北京 |
| 35 | 倫敦 |
| 30 | 里約熱內盧 |
| 28 | 鹽湖城 |
| 18 | 索契 |
| 7 | 悉尼 |
| 4 | 都靈 |
| 全部的 | 8 |
uj5u.com熱心網友回復:
您實際上可以GROUPING SETS為此使用。這避免了必須掃描表兩次。
但是,您仍然存在資料型別不匹配問題。您可以通過強制轉換來解決它,但只是交換列可能更容易
SELECT
CASE WHEN GROUPING(City) = 0 THEN City ELSE 'Total' END AS City,
CASE WHEN GROUPING(City_Id) = 0 THEN City_Id ELSE COUNT(*) END AS City_Id
FROM Table1
GROUP BY GROUPING SETS (
(City_Id, City),
()
)
ORDER BY GROUPING(City_Id);
SQL小提琴
這樣做是生成單獨的結果集,并結合在一起。您可以使用該GROUPING函式區分分組行和非分組行。
uj5u.com熱心網友回復:
我同意大多數其他評論,即從應用程式代碼中獲取結果集計數更合適(通常具有專門用于此目的的機制)。
然而...
如果您的問題必須有 TSQL 解決方案,則可以選擇在單獨的列中回傳計數。當然,這與在單獨的行中回傳它不同。每種方法都有利弊。
DROP TABLE IF EXISTS #Cities;
CREATE TABLE #Cities (
City_Id INT,
City VARCHAR(128)
);
INSERT INTO #Cities
VALUES
(41, 'Athena'),
(39, 'Beijing'),
(35, 'London'),
(30, 'Rio de Janeiro'),
(28, 'Salt Lake City'),
(18, 'Sochi'),
(7 , 'Sydney'),
(4 , 'Torino');
SELECT *, COUNT(*) OVER(ORDER BY (SELECT NULL)) AS Total
FROM #Cities;
--Count is properly reflected based on WHERE clause.
SELECT *, COUNT(*) OVER(ORDER BY (SELECT NULL)) AS Total
FROM #Cities
WHERE City LIKE 'S%';
--Be careful with this one--the COUNT(*) may not be what you expected.
SELECT TOP(4) *, COUNT(*) OVER(ORDER BY (SELECT NULL)) AS Total
FROM #Cities;
注意:請注意,對于大型結果集,此方法可能無法很好地擴展(執行)。一定要做一些測驗!
uj5u.com熱心網友回復:
如您所知,它應該在表示層中完成。但如果你只是想知道是否有任何方法,那么我建議使用UNION ALL
select cast(City_Id as varchar(10)) City_Id, City from Table1
union all
select 'Total' as City_Id, cast(count(*) as varchar(14)) from Table1
這是sql小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/387488.html
標籤:sql sql-server 查询语句
