[英]When using SQL Server UNION ALL, can I merge columns?
我在SQL Server中有兩個表。
JBIN
:所有發票清單。 ARTH
:所有已批准的發票清單。 我創建了一個查詢,該查詢顯示有關發票過期天數的信息。
結果表如下所示:
+-----------------------+--------------+--------------+------+
| OverdueRange | OverdueCount | Total Amount | INVO |
+-----------------------+--------------+--------------+------+
| Due in 0-7 days | 1 | 180215.61 | -1 |
| Due in 31-45 days | 1 | 153356.10 | -32 |
| Overdue by 46+ days | 1 | 125167.34 | 47 |
| Due in 0-7 days | 25 | 2708613.25 | -1 |
| Due in 31-45 days | 3 | 62312.51 | -32 |
| Overdue by 15-30 days | 12 | 295140.15 | 16 |
| Overdue by 1-7 days | 1 | 111070.25 | 2 |
| Overdue by 31-45 days | 1 | 2150.50 | 32 |
| Overdue by 46+ days | 8 | 546907.75 | 47 |
| Overdue by 8-14 days | 1 | 156985.68 | 9 |
+-----------------------+--------------+--------------+------+
在此查詢中,我有一個UNION ALL
語句。
該表的前三行來自JBIN
而其余ARTH
來自ARTH
。
使用UNION ALL
合並數據時是否可以。 例如,我沒有在0-7天之內有兩行稱為“到期”,而是有一個單行求和了OverdueCount和Total Amount字段。
例如
代替這個:
+-----------------+--------------+--------------+------+
| OverdueRange | OverdueCount | Total Amount | INVO |
+-----------------+--------------+--------------+------+
| Due in 0-7 days | 1 | 180215.61 | -1 |
| Due in 0-7 days | 25 | 2708613.25 | -1 |
+-----------------+--------------+--------------+------+
我要這個:
+-----------------+--------------+--------------+------+
| OverdueRange | OverdueCount | Total Amount | INVO |
+-----------------+--------------+--------------+------+
| Due in 0-7 days | 26 | 2888828.86 | -1 |
+-----------------+--------------+--------------+------+
僅供參考:
這是我的查詢:
WITH Temp ([InvDescription], [InvoiceAmount], [OverdueBy], [DatePaid])
AS
(select InvDescription, InvTotal as InvoiceAmount, (DATEDIFF(day,DueDate,GETDATE())) as OverdueBy, NULL as DatePaid from JBIN
Where InvStatus <> 'I' and JBCo = 1 and InvTotal > 0
),
Temp2 ([InvDescription], [InvoiceAmount], [OverdueBy], [DatePaid])
AS
(select Description, SUM(Invoiced) as InvoiceAmount, (DATEDIFF(day,DueDate,GETDATE())) as OverdueBy, PayFullDate as DatePaid from ARTH
Where ARCo = 1 and Invoiced > 0
Group By Description, DueDate, PayFullDate, Invoice
)
SELECT
CASE WHEN OverdueBy >= 46 THEN 'Overdue by 46+ days'
WHEN OverdueBy >= 31 and OverdueBy <= 45 THEN 'Overdue by 31-45 days'
WHEN OverdueBy >= 15 and OverdueBy <= 30 THEN 'Overdue by 15-30 days'
WHEN OverdueBy >= 8 and OverdueBy <= 14 THEN 'Overdue by 8-14 days'
WHEN OverdueBy >= 1 and OverdueBy <= 7 THEN 'Overdue by 1-7 days'
WHEN OverdueBy <= 0 and OverdueBy >= -7 THEN 'Due in 0-7 days'
WHEN OverdueBy <= -8 and OverdueBy >= -14 THEN 'Due in 8-14 days'
WHEN OverdueBy <= -15 and OverdueBy >= -30 THEN 'Due in 15-30 days'
WHEN OverdueBy <= -31 and OverdueBy >= -45 THEN 'Due in 31-45 days'
WHEN OverdueBy <= -46 THEN 'Due in 46+ days'
ELSE 'Less than that'
END AS OverdueRange,
Count(*) as OverdueCount,
Sum(Temp.InvoiceAmount) as [Total Amount],
CASE WHEN OverdueBy >= 46 THEN '47'
WHEN OverdueBy >= 31 and OverdueBy <= 45 THEN '32'
WHEN OverdueBy >= 15 and OverdueBy <= 30 THEN '16'
WHEN OverdueBy >= 8 and OverdueBy <= 14 THEN '9'
WHEN OverdueBy >= 1 and OverdueBy <= 7 THEN '2'
WHEN OverdueBy <= 0 and OverdueBy >= -7 THEN '-1'
WHEN OverdueBy <= -8 and OverdueBy >= -14 THEN '-9'
WHEN OverdueBy <= -15 and OverdueBy >= -30 THEN '-16'
WHEN OverdueBy <= -31 and OverdueBy >= -45 THEN '-32'
WHEN OverdueBy <= -46 THEN '-47'
ELSE 'ERROR'
END AS [INVO]
From Temp
group by CASE WHEN OverdueBy >= 46 THEN 'Overdue by 46+ days'
WHEN OverdueBy >= 31 and OverdueBy <= 45 THEN 'Overdue by 31-45 days'
WHEN OverdueBy >= 15 and OverdueBy <= 30 THEN 'Overdue by 15-30 days'
WHEN OverdueBy >= 8 and OverdueBy <= 14 THEN 'Overdue by 8-14 days'
WHEN OverdueBy >= 1 and OverdueBy <= 7 THEN 'Overdue by 1-7 days'
WHEN OverdueBy <= 0 and OverdueBy >= -7 THEN 'Due in 0-7 days'
WHEN OverdueBy <= -8 and OverdueBy >= -14 THEN 'Due in 8-14 days'
WHEN OverdueBy <= -15 and OverdueBy >= -30 THEN 'Due in 15-30 days'
WHEN OverdueBy <= -31 and OverdueBy >= -45 THEN 'Due in 31-45 days'
WHEN OverdueBy <= -46 THEN 'Due in 46+ days'
ELSE 'Less than that' END,
CASE WHEN OverdueBy >= 46 THEN '47'
WHEN OverdueBy >= 31 and OverdueBy <= 45 THEN '32'
WHEN OverdueBy >= 15 and OverdueBy <= 30 THEN '16'
WHEN OverdueBy >= 8 and OverdueBy <= 14 THEN '9'
WHEN OverdueBy >= 1 and OverdueBy <= 7 THEN '2'
WHEN OverdueBy <= 0 and OverdueBy >= -7 THEN '-1'
WHEN OverdueBy <= -8 and OverdueBy >= -14 THEN '-9'
WHEN OverdueBy <= -15 and OverdueBy >= -30 THEN '-16'
WHEN OverdueBy <= -31 and OverdueBy >= -45 THEN '-32'
WHEN OverdueBy <= -46 THEN '-47'
ELSE 'ERROR' END
UNION ALL
SELECT CASE WHEN OverdueBy >= 46 THEN 'Overdue by 46+ days'
WHEN OverdueBy >= 31 and OverdueBy <= 45 THEN 'Overdue by 31-45 days'
WHEN OverdueBy >= 15 and OverdueBy <= 30 THEN 'Overdue by 15-30 days'
WHEN OverdueBy >= 8 and OverdueBy <= 14 THEN 'Overdue by 8-14 days'
WHEN OverdueBy >= 1 and OverdueBy <= 7 THEN 'Overdue by 1-7 days'
WHEN OverdueBy <= 0 and OverdueBy >= -7 THEN 'Due in 0-7 days'
WHEN OverdueBy <= -8 and OverdueBy >= -14 THEN 'Due in 8-14 days'
WHEN OverdueBy <= -15 and OverdueBy >= -30 THEN 'Due in 15-30 days'
WHEN OverdueBy <= -31 and OverdueBy >= -45 THEN 'Due in 31-45 days'
WHEN OverdueBy <= -46 THEN 'Due in 46+ days'
ELSE 'Less than that' END AS OverdueRange,
Count(*) as OverdueCount,
Sum(Temp2.InvoiceAmount) as [Total Amount],
CASE WHEN OverdueBy >= 46 THEN '47'
WHEN OverdueBy >= 31 and OverdueBy <= 45 THEN '32'
WHEN OverdueBy >= 15 and OverdueBy <= 30 THEN '16'
WHEN OverdueBy >= 8 and OverdueBy <= 14 THEN '9'
WHEN OverdueBy >= 1 and OverdueBy <= 7 THEN '2'
WHEN OverdueBy <= 0 and OverdueBy >= -7 THEN '-1'
WHEN OverdueBy <= -8 and OverdueBy >= -14 THEN '-9'
WHEN OverdueBy <= -15 and OverdueBy >= -30 THEN '-16'
WHEN OverdueBy <= -31 and OverdueBy >= -45 THEN '-32'
WHEN OverdueBy <= -46 THEN '-47'
ELSE 'ERROR' END AS [INVO]
From Temp2
Where Temp2.DatePaid is null
group by CASE WHEN OverdueBy >= 46 THEN 'Overdue by 46+ days'
WHEN OverdueBy >= 31 and OverdueBy <= 45 THEN 'Overdue by 31-45 days'
WHEN OverdueBy >= 15 and OverdueBy <= 30 THEN 'Overdue by 15-30 days'
WHEN OverdueBy >= 8 and OverdueBy <= 14 THEN 'Overdue by 8-14 days'
WHEN OverdueBy >= 1 and OverdueBy <= 7 THEN 'Overdue by 1-7 days'
WHEN OverdueBy <= 0 and OverdueBy >= -7 THEN 'Due in 0-7 days'
WHEN OverdueBy <= -8 and OverdueBy >= -14 THEN 'Due in 8-14 days'
WHEN OverdueBy <= -15 and OverdueBy >= -30 THEN 'Due in 15-30 days'
WHEN OverdueBy <= -31 and OverdueBy >= -45 THEN 'Due in 31-45 days'
WHEN OverdueBy <= -46 THEN 'Due in 46+ days'
ELSE 'Less than that' END,
CASE WHEN OverdueBy >= 46 THEN '47'
WHEN OverdueBy >= 31 and OverdueBy <= 45 THEN '32'
WHEN OverdueBy >= 15 and OverdueBy <= 30 THEN '16'
WHEN OverdueBy >= 8 and OverdueBy <= 14 THEN '9'
WHEN OverdueBy >= 1 and OverdueBy <= 7 THEN '2'
WHEN OverdueBy <= 0 and OverdueBy >= -7 THEN '-1'
WHEN OverdueBy <= -8 and OverdueBy >= -14 THEN '-9'
WHEN OverdueBy <= -15 and OverdueBy >= -30 THEN '-16'
WHEN OverdueBy <= -31 and OverdueBy >= -45 THEN '-32'
WHEN OverdueBy <= -46 THEN '-47'
ELSE 'ERROR' END
您可以從並集所有查詢創建派生表。 像這樣:
select somefields, sum(something) thesum
from (
union all query goes here
) derivedTable
group by somefields
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.