Tuesday, 15 February 2011

When using SQL Server UNION ALL, can I merge columns? -



When using SQL Server UNION ALL, can I merge columns? -

i have 2 tables in sql server.

table 1: jbin : list of invoices. table 2: arth : list of invoices approved.

i have created query displays info on number of days invoice overdue by.

the results table looks this:

+-----------------------+--------------+--------------+------+ | overduerange | overduecount | total amount | invo | +-----------------------+--------------+--------------+------+ | due in 0-7 days | 1 | 180215.61 | -1 | | due in 31-45 days | 1 | 153356.10 | -32 | | overdue 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 15-30 days | 12 | 295140.15 | 16 | | overdue 1-7 days | 1 | 111070.25 | 2 | | overdue 31-45 days | 1 | 2150.50 | 32 | | overdue 46+ days | 8 | 546907.75 | 47 | | overdue 8-14 days | 1 | 156985.68 | 9 | +-----------------------+--------------+--------------+------+

in query, have union all statement.

the first 3 rows of table jbin whereas rest arth.

is possible, when using union all combine data. example, instead of having 2 rows called "due in 0-7 days, have 1 single row sums overduecount , total amount fields.

e.g.

instead of this:

+-----------------+--------------+--------------+------+ | overduerange | overduecount | total amount | invo | +-----------------+--------------+--------------+------+ | due in 0-7 days | 1 | 180215.61 | -1 | | due in 0-7 days | 25 | 2708613.25 | -1 | +-----------------+--------------+--------------+------+

i want this:

+-----------------+--------------+--------------+------+ | overduerange | overduecount | total amount | invo | +-----------------+--------------+--------------+------+ | due in 0-7 days | 26 | 2888828.86 | -1 | +-----------------+--------------+--------------+------+

fyi:

this query:

with temp ([invdescription], [invoiceamount], [overdueby], [datepaid]) (select invdescription, invtotal invoiceamount, (datediff(day,duedate,getdate())) overdueby, null datepaid jbin invstatus <> 'i' , jbco = 1 , invtotal > 0 ), temp2 ([invdescription], [invoiceamount], [overdueby], [datepaid]) (select description, sum(invoiced) invoiceamount, (datediff(day,duedate,getdate())) overdueby, payfulldate datepaid arth arco = 1 , invoiced > 0 grouping description, duedate, payfulldate, invoice ) select case when overdueby >= 46 'overdue 46+ days' when overdueby >= 31 , overdueby <= 45 'overdue 31-45 days' when overdueby >= 15 , overdueby <= 30 'overdue 15-30 days' when overdueby >= 8 , overdueby <= 14 'overdue 8-14 days' when overdueby >= 1 , overdueby <= 7 'overdue 1-7 days' when overdueby <= 0 , overdueby >= -7 'due in 0-7 days' when overdueby <= -8 , overdueby >= -14 'due in 8-14 days' when overdueby <= -15 , overdueby >= -30 'due in 15-30 days' when overdueby <= -31 , overdueby >= -45 'due in 31-45 days' when overdueby <= -46 'due in 46+ days' else 'less that' end overduerange, count(*) overduecount, sum(temp.invoiceamount) [total amount], case when overdueby >= 46 '47' when overdueby >= 31 , overdueby <= 45 '32' when overdueby >= 15 , overdueby <= 30 '16' when overdueby >= 8 , overdueby <= 14 '9' when overdueby >= 1 , overdueby <= 7 '2' when overdueby <= 0 , overdueby >= -7 '-1' when overdueby <= -8 , overdueby >= -14 '-9' when overdueby <= -15 , overdueby >= -30 '-16' when overdueby <= -31 , overdueby >= -45 '-32' when overdueby <= -46 '-47' else 'error' end [invo] temp grouping case when overdueby >= 46 'overdue 46+ days' when overdueby >= 31 , overdueby <= 45 'overdue 31-45 days' when overdueby >= 15 , overdueby <= 30 'overdue 15-30 days' when overdueby >= 8 , overdueby <= 14 'overdue 8-14 days' when overdueby >= 1 , overdueby <= 7 'overdue 1-7 days' when overdueby <= 0 , overdueby >= -7 'due in 0-7 days' when overdueby <= -8 , overdueby >= -14 'due in 8-14 days' when overdueby <= -15 , overdueby >= -30 'due in 15-30 days' when overdueby <= -31 , overdueby >= -45 'due in 31-45 days' when overdueby <= -46 'due in 46+ days' else 'less that' end, case when overdueby >= 46 '47' when overdueby >= 31 , overdueby <= 45 '32' when overdueby >= 15 , overdueby <= 30 '16' when overdueby >= 8 , overdueby <= 14 '9' when overdueby >= 1 , overdueby <= 7 '2' when overdueby <= 0 , overdueby >= -7 '-1' when overdueby <= -8 , overdueby >= -14 '-9' when overdueby <= -15 , overdueby >= -30 '-16' when overdueby <= -31 , overdueby >= -45 '-32' when overdueby <= -46 '-47' else 'error' end union select case when overdueby >= 46 'overdue 46+ days' when overdueby >= 31 , overdueby <= 45 'overdue 31-45 days' when overdueby >= 15 , overdueby <= 30 'overdue 15-30 days' when overdueby >= 8 , overdueby <= 14 'overdue 8-14 days' when overdueby >= 1 , overdueby <= 7 'overdue 1-7 days' when overdueby <= 0 , overdueby >= -7 'due in 0-7 days' when overdueby <= -8 , overdueby >= -14 'due in 8-14 days' when overdueby <= -15 , overdueby >= -30 'due in 15-30 days' when overdueby <= -31 , overdueby >= -45 'due in 31-45 days' when overdueby <= -46 'due in 46+ days' else 'less that' end overduerange, count(*) overduecount, sum(temp2.invoiceamount) [total amount], case when overdueby >= 46 '47' when overdueby >= 31 , overdueby <= 45 '32' when overdueby >= 15 , overdueby <= 30 '16' when overdueby >= 8 , overdueby <= 14 '9' when overdueby >= 1 , overdueby <= 7 '2' when overdueby <= 0 , overdueby >= -7 '-1' when overdueby <= -8 , overdueby >= -14 '-9' when overdueby <= -15 , overdueby >= -30 '-16' when overdueby <= -31 , overdueby >= -45 '-32' when overdueby <= -46 '-47' else 'error' end [invo] temp2 temp2.datepaid null grouping case when overdueby >= 46 'overdue 46+ days' when overdueby >= 31 , overdueby <= 45 'overdue 31-45 days' when overdueby >= 15 , overdueby <= 30 'overdue 15-30 days' when overdueby >= 8 , overdueby <= 14 'overdue 8-14 days' when overdueby >= 1 , overdueby <= 7 'overdue 1-7 days' when overdueby <= 0 , overdueby >= -7 'due in 0-7 days' when overdueby <= -8 , overdueby >= -14 'due in 8-14 days' when overdueby <= -15 , overdueby >= -30 'due in 15-30 days' when overdueby <= -31 , overdueby >= -45 'due in 31-45 days' when overdueby <= -46 'due in 46+ days' else 'less that' end, case when overdueby >= 46 '47' when overdueby >= 31 , overdueby <= 45 '32' when overdueby >= 15 , overdueby <= 30 '16' when overdueby >= 8 , overdueby <= 14 '9' when overdueby >= 1 , overdueby <= 7 '2' when overdueby <= 0 , overdueby >= -7 '-1' when overdueby <= -8 , overdueby >= -14 '-9' when overdueby <= -15 , overdueby >= -30 '-16' when overdueby <= -31 , overdueby >= -45 '-32' when overdueby <= -46 '-47' else 'error' end

you can create derived table union query. this:

select somefields, sum(something) thesum ( union query goes here ) derivedtable grouping somefields

sql sql-server sum union-all

No comments:

Post a Comment