我有一個通用的 Sales 表,我正在查詢它,我想回傳表的兩個聚合,但是在兩個單獨的行而不是一個行上。
我有一個查詢來獲取這樣的值:
SELECT
SUM(o.SalesAmount) Value
,'Yearly Sales' Name
,'Yearly' Timeframe
FROM Orders o
回傳單行
| 價值 | 姓名 | 大體時間 |
|---|---|---|
| 1,000,000 | 年銷售額 | 每年 |
有沒有辦法讓我構建我的查詢,以便我可以在第二行回傳另一個聚合,但在同一查詢上使用不同的名稱和時間范圍?現在我正在復制第一個查詢和一堆我在第二個查詢中需要相同的過濾器,但更改聚合和“名稱”,然后將它們全部合并在一起,如下所示:
SELECT
SUM(o.SalesAmount) Value
,'Yearly Sales' Name
,'Yearly' Timeframe
FROM Orders o
WHERE
/* bunch of filters */
UNION ALL
SELECT
COUNT(o.Orders) Value
, 'Yearly Orders' Name
,'Yearly' Timeframe
FROM Orders o
WHERE
/* bunch of filters which are the same as the first */
我有大約 10 個其他聚合需要以類似的方式回傳,我認為合并 12 個真正相似的查詢不是解決問題的方法。
理想情況下,我想要這樣的東西(我知道這不會給我我需要的東西)所以我可以使用相同的過濾器而不必重復代碼。
SELECT
SUM(o.SalesAmount) Value
, COUNT(o.Orders) Value2
,'Yearly Sales' Name
, 'Yearly Orders' Name2
,'Yearly' Timeframe
FROM Orders o
WHERE
/* bunch of filters that I only have to manage in one spot */
然后會回傳這個:
| 價值 | 姓名 | 大體時間 |
|---|---|---|
| 1,000,000 | 年銷售額 | 每年 |
| 100,000 | 年度訂單 | 每年 |
uj5u.com熱心網友回復:
您可以從 cte 中取消旋轉它
with cte as (
SELECT
SUM(o.SalesAmount) Value1,
COUNT(o.Orders) Value2,
'Yearly' Timeframe
FROM Orders o
WHERE
/* bunch of filters */
)
SELECT Value1 Value,'Yearly Sales' Name, Timeframe
FROM cte
UNION ALL
SELECT Value2, 'Yearly Orders', Timeframe
FROM cte
uj5u.com熱心網友回復:
使用cross apply每個分割Orders行分為兩個:
select sum(split.Value) Value
,split.Name
,'Yearly' Timeframe
from Orders o
cross apply (values
('Yearly Sales' ,o.SalesAmount)
,('Yearly Orders',1)
) split(Name,Value)
group by split.Name
uj5u.com熱心網友回復:
您可以在派生表中聚合后對其進行逆透視:
SELECT
v.Value
v.Name
t.Timeframe
FROM (
SELECT
SUM(o.SalesAmount) Sum,
COUNT(o.Orders) Count,
'Yearly' Timeframe
FROM Orders o
) o
CROSS APPLY (VALUES
('Yearly Sales', Sum),
('Yearly Orders', Count)
) v(Name, Value);
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/343717.html
標籤:sql sql-server 查询语句
上一篇:使用聚合字串的SQL連接
