SSRS Combine Multiple Rows into One - ssrs-2012

I'm putting together an SSRS Report that will show what people owe for their membership dues.
Right now I get a few different rows per person depending on if they have Dues, Late Fees, or Refunds.
I need to be able to show these as one row instead of as three separate rows.
My list currently shows as:
Member ID | Name | Date | Dues | Refund | Late Fee | Inv ID | Total
123456789 | John | 2015 | $150 | ------ | -------- | INV 01 | $150
123456789 | John | 2015 | ---- | ------ | -----$10 | INV 01 | $10
987654321 | Jane | 2015 | $150 | ------ | -------- | INV 02 | $150
What I'd like it to show as:
Member ID | Name | Date | Dues | Refund | Late Fee | Inv ID | Total
123456789 | John | 2015 | $150 | ------ | -----$10 | INV 01 | $160
987654321 | Jane | 2015 | $150 | ------ | -------- | INV 02 | $150
--Clarification--
Right now the only way to tell which an item is, is by the description of the item; i.e., the item name would be Membership Dues, or Membership Late Fee, or Membership Refund, which end up making the different line items.

Then you need to aggregate your data:
select member_id, name, date, sum(dues) dues
, sum(refund) refund, sum(late_fee) late_fee
, inv_id, sum(total) total
from your_table
group by member_id, name, date, inv_id;

I finally got it to work with the following SQL:
WITH cte_Intial AS (
SELECT
c.firstname
,c.lastname
,c.new_memberid
,s.new_invid
,CASE
WHEN sd.productidname LIKE 'Late%' THEN NULL
ELSE s.totalamount
END AS "Dues"
,CASE
WHEN sd.productidname LIKE 'Late%' THEN s.totalamount
ELSE null
END AS "LateFee"
,s.new_purchasedate
,s.name
,sd.productidname
FROM
Filteredcontact AS c
INNER JOIN FilteredSalesOrder AS s ON c.new_memberid = s.new_memberid
INNER JOIN FilteredSalesOrderDetail AS sd ON s.salesorderid = sd.salesorderid
WHERE
c.new_divisioncode = 'A' AND sd.productidname LIKE '%Dues%' AND
DATEPART(YEAR, CAST(s.new_purchasedate AS DATE)) = 2015
)
SELECT
firstname
,lastname
,new_memberid
,ISNULL(MAX(Invoice), '')/* + ' ' + ISNULL(MAX(Late), '')*/ as Invoice
,MAX(Dues) as Dues
,MAX(LateFee) as LateFee
,new_purchasedate
,name
FROM
cte_Intial
GROUP BY
firstname
,lastname
,new_memberid
,new_purchasedate
,name

Related

how to select only external tranzactions(column values) in oracle?

i have a first table with id_client,id_card (info table)
and second with id_debet,id_credit,value,vale_info (tranzaction table)
first table second table
______________________ ________________________________________________________
|id_client | id_card | |id_debet |id_credit | value | value info |
|50102411 | 5166 | | 5166 | 5167 | 300$ | transfer to client card |
|50102411 | 5167 | | 5167 | 4931239 | 100$ | UBER taxi NY |
|50102412 | 5168 | | 5168 | 5169 | 200$ | transfer to client card |
|50102412 | 5169 | | 5169 | 3582934 | 120$ | rent hotel room |
______________________ ________________________________________________________
id_debet -> spend from your card
id_Debet -> replenishment to your card
and i want to select only external tranzaction not between card clients
for ex
if 5166 send money to 5167 i skip this tranzaction
if 5166 send to another card i select it etc
You can use a NOT EXISTS query to find all transactions in the second table that have an id_debet or id_credit which is not in the first table:
SELECT *
FROM table2 t2
WHERE NOT EXISTS (SELECT *
FROM table1 t1
WHERE t1.id_card = t2.id_debet)
OR NOT EXISTS (SELECT *
FROM table1 t1
WHERE t1.id_card = t2.id_credit)
Output:
id_debet id_credit value value info
5167 4931239 100$ UBER taxi NY
5169 3582934 120$ rent hotel room
Demo on dbfiddle
You can use GROUP BY and HAVING as follows:
SELECT T.id_debet, T.id_credit, T.value, T.value info FROM tranzaction T
JOIN info I ON I.id_card IN (T.id_debet, T.id_credit)
GROUP BY T.id_debet, T.id_credit, T.value, T.value
HAVING COUNT(1) = 1

how to use order by multiple times on the results set along with rownum (oracle)

I have the below tables:
person table
personid | firstname | lastname
------------------------------
P1 | Jim | John
P2 | Kori | Test
P3 | Adam | Blair
P4 | Kim | sand
P5 | julia | Dan
order table
orderno |ordername | price | personid
---------------------------------
1 |shoes | 100 | P1
2 |books | 50 |P2
3 | pen | 10 |P3
4 |laptop | 80 |P4
5 |notebook | 40 |P5
Email address table
clientid emailid
---------------------
P1 | jom.John#test.com
P3 | adam.blair#test.com
P4 | kim.sand#test.com
I have to get the top 3 person names ordered by 'price' and then get rid of the persons who dont have an email address and this final list should be ordered by firstname (desc)
My results should look like:
Firstname lastname price
------------------------------
Kim | sand | 80
Jim | john | 100
I tried minus but not able to figure out how to use order by (first by price) and then for the final results by firstname. oracle is not liking the combination of multiple order by and rownum together.
Any pointers would be helpful.
Try this:-
SELECT P.FIRSTNAME,P.LASTNAME,O.PRICE FROM PERSON_TABLE P
INNER JOIN ORDER_TABLE O
ON P.PERSONID = O.PERSONID
AND P.PERSONID NOT IN
(SELECT E.CLIENTID FROM EMAIL_ADDRESS_TABLE E)
ORDER BY P.FIRSTNAME desc;
output:
Firstname lastname price
------------------------
kim | sand | 80
julia | dan | 40
My result is not look like as your but it may be help you. I wrote above script as per your above mentioned requirement.

insert id number only in sql

I have a SQL Server table like this
+----+-----------+------------+
| id | acoount | date |
+----+-----------+------------+
| | John | 2/6/2016 |
| | John | 2/6/2016 |
| | John | 4/6/2016 |
| | John | 4/6/2016 |
| | Andi | 5/6/2016 |
| | Steve | 4/6/2016 |
+----+-----------+------------+
i want insert the id coloumn like this.
+-----------+-----------+------------+
| id | acoount | date |
+-----------+-----------+------------+
| 020616001 | John | 2/6/2016 |
| 020616002 | John | 2/6/2016 |
| 040616001 | John | 4/6/2016 |
| 040616002 | John | 4/6/2016 |
| 050616001 | Andi | 5/6/2016 |
| 040616003 | Steve | 4/6/2016 |
+-----------+-----------+------------+
I want to generate id number of the date provided like this. 02+06+16(from date)+001 = 020616001. if have same date, id + 1.
I have tried but still failed .
I want make it in oracle sql develop.
Someone help me.
Thanks.
Try the below SQL as per the given data, Its in SQL Server 2012....
select REPLACE(CONVERT(VARCHAR(10),convert(date,t.[date]), 101), '/', '')
+'00'+convert(varchar(2),row_number()over(partition by account,[date] order by t.[date])) as ID,
t.account,
t.date
from (values ('John','2/6/2016'),
('John','2/6/2016'),
('John','4/6/2016'),
('John','4/6/2016'),
('Andi','5/6/2016'),
('Steve','4/6/2016'))T(account,[date])
Update your table using statement .
update table set id= replace(CONVERT(VARCHAR(10),CONVERT(datetime ,date,103),3) ,'/', '') + Right('00'+convert(varchar(2),row_number()over(partition by account,[date] order by t.[date])) ,3)
MySql
i can give you the logic of 020616001 this part right now .......
for same id +1 i have to work on it....that i ll let u know after my work
insert into table_name(id)
select concat
(
if(length (day(current_date))>1,day(current_date),Concat(0,day(current_date))),
if(length (month(current_date))>1,month(current_date),Concat(0,month(current_date))),
(right(year(current_date),2)),'001'
)as id
you cannot convert your dates column to datetime type in normal way because it is dd/mm/yyyy.
Try this,
declare #t table(acoount varchar(50),dates varchar(20))
insert into #t values
('John','2/6/2016')
,('John','2/6/2016')
,('John','4/6/2016')
,('John','4/6/2016')
,('Andi','5/6/2016')
,('Steve','4/6/2016')
;With CTE as
(select * , SUBSTRING(dates,0,charindex('/',dates)) dd
,SUBSTRING(stuff(dates,1,charindex('/',dates),''),0, charindex('/',stuff(dates,1,charindex('/',dates),''))) MM
,right(dates,2) yy
from #t
)
,CTE1 as
(
select *
,ROW_NUMBER()over(partition by yy,mm,dd order by yy,mm,dd)rn from cte c
)
select *, REPLICATE('0',2-len(dd))+cast(dd as varchar(2))
+REPLICATE('0',2-len(MM))+cast(MM as varchar(2))
+yy+REPLICATE('0',3-len(rn))+cast(rn as varchar(2))
from cte1

LISTAGG function with two columns

I have one table like this (report)
--------------------------------------------------
| user_id | Department | Position | Record_id |
--------------------------------------------------
| 1 | Science | Professor | 1001 |
| 1 | Maths | | 1002 |
| 1 | History | Teacher | 1003 |
| 2 | Science | Professor | 1004 |
| 2 | Chemistry | Assistant | 1005 |
--------------------------------------------------
I'd like to have the following result
---------------------------------------------------------
| user_id | Department+Position |
---------------------------------------------------------
| 1 | Science,Professor;Maths, ; History,Teacher |
| 2 | Science, Professor; Chemistry, Assistant |
---------------------------------------------------------
That means I need to preserve the empty space as ' ' as you can see in the result table.
Now I know how to use LISTAGG function but only for one column. However, I can't exactly figure out how can I do for two columns at the sametime. Here is my query:
SELECT user_id, LISTAGG(department, ';') WITHIN GROUP (ORDER BY record_id)
FROM report
Thanks in advance :-)
It just requires judicious use of concatenation within the aggregation:
select user_id
, listagg(department || ',' || coalesce(position, ' '), '; ')
within group ( order by record_id )
from report
group by user_id
i.e. aggregate the concatentation of department with a comma and position and replace position with a space if it is NULL.

List customer ID, name and all of his/her accounts

customers:
+------------+--------------+
| cid | Name |
+------------+--------------+
| 1 | Bob |
| 2 | John |
| 3 | Jane |
+------------+--------------+
accounts:
+------------+--------------+
| aid | type |
+------------+--------------+
| 1 | Checking |
| 2 | Saving |
| 3 | CD |
+------------+--------------+
transactions:
+------------+--------------+--------------+
| tid | cid | aid |
+------------+--------------+--------------+
| 1 | 1 | 1 |
| 2 | 2 | 1 |
| 3 | 1 | 2 |
| 4 | 2 | 3 |
| 5 | 3 | 1 |
+------------+--------------+--------------+
I am trying to write a plsql procedure that, given the customer id as a parameter, will display his/her id, name and all accounts. Displaying the id and name is simple enough. What I'm not sure about is how to get all the accounts that are linked to the customer id and how to retrieve more than a single account.
An ideea can be:
select c.cid, c.name, a.type
from customers c
left join transactions t on (t.cid = c.cid)
left join accounts a on (a.aid = t.aid)
where c.cid = :customer_id
group by c.cid, c.name, a.type;
the group by is needed because can be more transactions.
Further, if you want to see one line:
select cid, name, LISTAGG(type, ',') WITHIN GROUP (ORDER BY type) as account_types
from(
select distinct c.cid, c.name, a.type
from customers c
left join transactions t on (t.cid = c.cid)
left join accounts a on (a.aid = t.aid)
where c.cid = :customer_id
)
group by cid, name;
Putting this into a stored procedure/function is too simple, so I let it to you.

Resources