SQL Query /stored procedure to get complete organization hierarchy detail - sql-server-2008

I tried and searched the solution for the below problem statement but unfortunately I didn't get the exact output. I need to display the complete organizational hierarchy in the below format. I tried with using CTE with UNION ALL but still I'm unable to get the exact output.
Table structure:
CREATE TABLE EMPMASTER
(
EMPID CHAR(10),
EMPNAME NVARCHAR(50),
EMPDESIG VARCHAR(20),
MRGID CHAR(10)
);
Output:
EMPNAME EMPID EMP DESIGNATION
------------------------------------
EMP1 00001 CEO
EMP2 00009 MANAGER 1
EMP3 00005 TL1
EMP4 00003 SSD1
EMP5 00006 SD1
EMP6 00008 TL2
EMP7 00020 SSD2
EMP8 25 SD2
EMP9 00030 TL3
EMP10 00017 MANAGER2
EMP11 00029 TL4
EMP12 00045 SSD3
EMP13 00060 SSD4
EMP14 00070 SD3
EMP15 00060 SD4
EMP16 00090 SD5
EMP17 00055 SD6
CONTI… CONTI… CONTI…
Code that I tried:
WITH HierarchyTree (EMPID, EMPNAME, EMPDESIG, MRGID, Rank)
AS
(
-- Anchor member definition
SELECT
EMPID, EMPNAME, EMPDESIG, MRGID, 0 AS Rank
FROM
EMPMASTER AS e
WHERE
DESIGNATION = 'Admin' AND EMPLOYEE_ID='1'
UNION ALL
-- Recursive member definition
SELECT
e.EMPID, e.EMPNAME, e.EMPDESIG, e.MRGID, Rank + 1
FROM
EMPMASTER AS e
INNER JOIN
HierarchyTree AS d ON e.REPORTINGTO = d.EMPLOYEE_ID
)
SELECT
EMPID, EMPNAME, DESIGNATION, REPORTINGTO, Rank
FROM
HierarchyTree
Sample data
EMPID EMPNAME EMPDESIG MRGID
1 RAM CEO 0
7326 MOHD RAFI MANAGER 7454
7454 PMT PHARMA MANAGER 1
2094 VAC SANJAY DEVELOPER 14005
602 GS MANAGER 7454
412 RAJESH LEAD 602
14005 VAC SM N LEAD 7326
34395 DEEPAK LEAD 7326
16430 VIJAY DEVELOPER 34395

I would venture to suggest an answer based on the hierarchy diagram:
declare #EMPMASTER table
(
EMPID CHAR(10) ,
EMPNAME NVARCHAR(50) ,
EMPDESIG VARCHAR(20) ,
MRGID CHAR(10)
);
insert into #EMPMASTER values
( '00001', 'EMP1', 'CEO', null ),
( '00002', 'EMP2', 'MANAGER1', '00001' ),
( '00003', 'EMP3', 'TL1', '00002' ),
( '00004', 'EMP4', 'SSD1', '00003' ),
( '00005', 'EMP5', 'SD1', '00004' ),
( '00006', 'EMP6', 'TL2', '00002' ),
( '00007', 'EMP7', 'SSD2', '00006' ),
( '00008', 'EMP8', 'SD2', '00007' ),
( '00009', 'EMP9', 'TL3', '00002' ),
( '00010', 'EMP10', 'MANAGER2', '00001' ),
( '00011', 'EMP11', 'TL4', '00010' ),
( '00012', 'EMP12', 'SSD3', '00011' ),
( '00013', 'EMP13', 'SSD4', '00011' ),
( '00014', 'EMP14', 'SD3', '00013' ),
( '00015', 'EMP15', 'SD4', '00013' ),
( '00016', 'EMP16', 'SD5', '00013' ),
( '00017', 'EMP17', 'SD6', '00013' ),
( '00018', 'EMP18', 'MANAGER3', '00001' ),
( '00019', 'EMP19', 'TL5', '00018' ),
( '00020', 'EMP20', 'SSD5', '00019' ),
( '00021', 'EMP21', 'SSD6', '00019' ),
( '00022', 'EMP22', 'SD7', '00021' ),
( '00023', 'EMP23', 'SD8', '00021' ),
( '00024', 'EMP24', 'TL6', '00018' ),
( '00025', 'EMP25', 'SSD7', '00024' );
with cte as
(
select
EMPID ,
EMPNAME ,
EMPDESIG ,
MRGID ,
LEVEL = 0,
PATH = cast(EMPDESIG as varchar(8000))
from
#EMPMASTER
where
MRGID is null
UNION ALL
select
t.EMPID ,
t.EMPNAME ,
t.EMPDESIG ,
t.MRGID ,
LEVEL = cte.LEVEL + 1,
PATH = cast(cte.PATH + ' > '+ t.EMPDESIG as varchar(8000))
from
#EMPMASTER t
inner join cte on cte.EMPID = t.MRGID
)
select
EMPID ,
EMPNAME ,
EMPDESIG ,
MRGID ,
LEVEL ,
PATH ,
HIERARCHY = replicate(' ', LEVEL) + EMPDESIG
from
cte
order by
PATH;
The same but with the provided data samples:
declare #EMPMASTER table
(
EMPID CHAR(10) ,
EMPNAME NVARCHAR(50) ,
EMPDESIG VARCHAR(20) ,
MRGID CHAR(10)
);
insert into #EMPMASTER values
('1' , 'RAM' , 'CEO' , '0' ),
('7326' , 'MOHD RAFI' , 'MANAGER' , '7454' ),
('7454' , 'PMT PHARMA' , 'MANAGER' , '1' ),
('2094' , 'VAC SANJAY' , 'DEVELOPER' , '14005' ),
('602' , 'GS' , 'MANAGER' , '7454' ),
('412' , 'RAJESH' , 'LEAD' , '602' ),
('14005' , 'VAC SM N' , 'LEAD' , '7326' ),
('34395' , 'DEEPAK' , 'LEAD' , '7326' ),
('16430' , 'VIJAY' , 'DEVELOPER' , '34395' );
with cte as
(
select
EMPID ,
EMPNAME ,
EMPDESIG ,
MRGID ,
LEVEL = 0,
PATH = cast(EMPDESIG + ' (' + EMPNAME +')' as varchar(8000))
from
#EMPMASTER
where
MRGID = '0'
UNION ALL
select
t.EMPID ,
t.EMPNAME ,
t.EMPDESIG ,
t.MRGID ,
LEVEL = cte.LEVEL + 1,
PATH = cast(cte.PATH + ' > ' + t.EMPDESIG + ' (' + t.EMPNAME +')' as varchar(8000))
from
#EMPMASTER t
inner join cte on cte.EMPID = t.MRGID
)
select
EMPID ,
EMPNAME ,
EMPDESIG ,
MRGID ,
LEVEL ,
PATH ,
HIERARCHY = replicate(' ', LEVEL) + EMPDESIG + ' (' + EMPNAME +')'
from
cte
order by
PATH;

Related

how do i combine results in mysql from 3 different tables with unique id

Here is the situation i have 3 tables lets say
cust_data, deposit_data, transaction_info:
in cust_data I have Firstname, Lastname, Email ,Phone, customer_id
in deposit_data I have deposit_id, deposit_data,date,amount
in transaction_info I have customer_id,deposit_id, email, transaction_date,processor
Now I need to list all info of the customer with all the deposits he made for example:
cust_info : (Firstname, Lastname, Email ,Phone, customer_id)
1) John , smith , johnsmith#bla.com, 11111111, 111-111-111
2) Sara , sugar , sarasugar#lala.com, 22222222, 222-222-222
Deposit_data: (deposit_id, deposit_data,date,amount)
1) 187823 , " some processing info card number...." , 10/10/2019 , 100
2) 908202 , " some processing info card number...." , 11/11/2019 , 90
3) 323243 , " some processing info card number...." , 12/12/2019 , 100
transaction_info: (customer_id,deposit_id, email, transaction_date,processor)
1) 111-111-111 , 908202 , johnsmith#bla.com , 11/11/2019 , googlepay
2) 111-111-111 , 187823 , johnsmith#bla.com , 10/10/2019 , visa
3) 222-222-222 , 323243 , sarasugar#lala.com, 12/12/2019 , visa
Now I want to make 1 query that will show me all the deposits the customer made so the result will look like:
customer_id,Firstname, Lastname, Email ,Phone, amount(bydate) :
111-111-111 John , smith , johnsmith#bla.com ,11111111 , (10/10/2019 : 100 | 10/10/2019 : 90)
Better if I can make everything in the same statement, I just dont know how to combine all 3.
GROUP BY GROUP_CONCAT INNER JOIN, gives you the answer
Dates should always be saved in MySQL format, or else, when you have to use functions with it , you have to convert them always
CREATE TABLE cust_info (
`Firstname` VARCHAR(4),
`Lastname` VARCHAR(5),
`Email` VARCHAR(18),
`Phone` INTEGER,
`customer_id` VARCHAR(11)
);
INSERT INTO cust_info
(`Firstname`, `Lastname`, `Email`, `Phone`, `customer_id`)
VALUES
('John', 'smith', 'johnsmith#bla.com', '11111111', '111-111-111'),
('Sara', 'sugar', 'sarasugar#lala.com', '22222222', '222-222-222');
CREATE TABLE Deposit_data (
`deposit_id` INTEGER,
`deposit_data` VARCHAR(39),
`date` VARCHAR(10),
`amount` INTEGER
);
INSERT INTO Deposit_data
(`deposit_id`, `deposit_data`, `date`, `amount`)
VALUES
('187823', ' some processing info card number....', '10/10/2019', '100'),
('908202', ' some processing info card number....', '11/11/2019', '90'),
('323243', ' some processing info card number....', '12/12/2019', '100');
CREATE TABLE transaction_info (
`customer_id` VARCHAR(11),
`deposit_id` INTEGER,
`email` VARCHAR(18),
`transaction_date` varchar(10),
`processor` VARCHAR(9)
);
INSERT INTO transaction_info
(`customer_id`, `deposit_id`, `email`, `transaction_date`, `processor`)
VALUES
('111-111-111', '908202', 'johnsmith#bla.com', '11/11/2019', 'googlepay'),
('111-111-111', '187823', 'johnsmith#bla.com', '10/10/2019', 'visa'),
('222-222-222', '323243', 'sarasugar#lala.com', '12/12/2019', 'visa');
SELECT
ci.customer_id,
ci.Firstname,
ci.Lastname,
ci.Email,
ci.Phone
,
group_concat(
dd.date, ' : ', dd.amount
order by dd.date
separator ' | ') 'amount(bydate)'
FROM
cust_info ci
INNER JOIN
transaction_info ti ON ti.customer_id = ci.customer_id
INNER JOIN
Deposit_data dd ON dd.deposit_id = ti.deposit_id
GROUP BY ci.customer_id , ci.Firstname , ci.Lastname , ci.Email , ci.Phone
customer_id | Firstname | Lastname | Email | Phone | amount(bydate)
:---------- | :-------- | :------- | :----------------- | -------: | :---------------------------------
111-111-111 | John | smith | johnsmith#bla.com | 11111111 | 10/10/2019 : 100 | 11/11/2019 : 90
222-222-222 | Sara | sugar | sarasugar#lala.com | 22222222 | 12/12/2019 : 100
db<>fiddle here
You can use string aggregation. A correlated subquery might be more efficient than joins and outer aggregation:
select
c.*,
(
select group_concat(
d.date, ' : ', d.amount
order by d.date
separator ' | '
from transaction_info t
inner join deposit_data d on d.deposit_id = t.deposit_id
where t.customer_id = c.customer_id
)
from cust_info c
You can add a where clause to the outer query to filter on a given customer if needed.
You can use next query as solution:
select
ci.customer_id,
Firstname,
Lastname,
ci.Email,
Phone,
group_concat(CONCAT(dd.date, ' : ', dd.amount)SEPARATOR ' | ') deposit
from cust_info ci
left join transaction_info ti on ci.customer_id = ti.customer_id
join Deposit_data dd on dd.deposit_id = ti.deposit_id
group by ci.customer_id, Firstname, Lastname, ci.Email, Phone
;
Here you can look working example
You need an inner join select statment.
SELECT * FROM cust_info c INNER JOIN transaction_info t ON c.cusomter_id = t.customer_id INNER JOIN deposit_data d ON d.deposit_id = t.deposit_id
This should be work fine

How to avoid showing multiple row? Mysql

SELECT
`BillNum`
, GROUP_CONCAT(CONCAT( `City` , ' / ' , `Region` , ' / ' , `StreetName` , ' / ' , `Closepoint`)) AS 'Address'
, GROUP_CONCAT(CONCAT('(', `ItemCount` ,')', `ItemName` , ' ' )separator ' ') AS OrderInfo
, CustomerPhone , `OrderTime`
FROM orderin
INNER JOIN `customers`
WHERE `CustomerPhone` = `customers`.`PhoneNumber`
AND `TableNum` = '0' AND DeleveryState = '0'
GROUP BY `BillNum`
ORDER BY `BillNum`;
Where is this wrong ? Why the address is multiplied ?
Add Distinct to your Group_Concat
Like
SELECT
`BillNum`
, GROUP_CONCAT(DISTINCT CONCAT( `City` , ' / ' , `Region` , ' / ' , `StreetName` , ' / ' , `Closepoint`)) AS 'Address'
, GROUP_CONCAT(DISTINCT CONCAT('(', `ItemCount` ,')', `ItemName` , ' ' )separator ' ') AS OrderInfo
, CustomerPhone , `OrderTime`
FROM orderin INNER JOIN `customers`
WHERE `CustomerPhone` = `customers`.`PhoneNumber`
AND `TableNum` = '0' AND DeleveryState = '0'
GROUP BY `BillNum`
ORDER BY `BillNum`

SSRS subscription migration

I have several SSRS subscriptions built but my company just did a domain conversion and those subscriptions are all saved to my old domain login. This had led to a few questions:
1) Is there a way to move all those subscriptions to my new account?
2) Is it possible to setup the subscriptions to be viewable by multiple users?
3) Is it possible to setup the subscriptions to be editable by multiple users?
We are using SSRS 2012
I had to do this a few times at my last organization.
To answer your first question, I use the script below to update the subscription and report owners. I use SQL Command Mode to easily change to different servers. It is also necessary for the variables.
To turn on SQL Command Mode in SSMS, on the menu bar click on Query | SQLCMD Mode
Note: The NewUser must already exist in dbo.Users and you must have UPDATE permission on the dbo.ReportServer database to use this script.
/*------------------------------------------------------------------------------+
| Purpose: To Update the owner of deployed reports and subscriptions
| Note: SQLCmdMode Script
+--------------------------------------------------------------------------------
*/
:setvar _server "***YourServerNameHere***"
:setvar _database "ReportServer"
:connect $(_server)
USE [$(_database)];
GO
:SETVAR OldUser "DOMAIN\OldUserName"
:SETVAR NewUser "DOMAIN\NewUserName"
SET XACT_ABORT ON
BEGIN TRANSACTION
PRINT '====================================================================='
PRINT 'Update subscriptions...'
PRINT '====================================================================='
;WITH
new_owner
AS
(
SELECT [UserID], [UserName] FROM dbo.[Users] WHERE [UserName] = N'$(NewUser)'
)
,
subscription_source
AS
(
SELECT
s.[Report_OID]
, [OldOwner] = ou.[UserName]
, [OldOwnerID] = ou.[UserID]
, [NewOwner] = nu.[UserName]
, [NewOwnerID] = nu.[UserID]
FROM
dbo.[Subscriptions] AS s
INNER JOIN dbo.[Users] AS ou ON ou.[UserID] = s.[OwnerID]
, new_owner AS nu
WHERE
1=1
AND ou.[UserName] = N'$(OldUser)'
)
--SELECT * FROM subscription_source
MERGE dbo.Subscriptions AS T
USING subscription_source AS S ON T.[Report_OID] = S.[Report_OID]
WHEN MATCHED
THEN UPDATE SET
T.[OwnerID] = S.[NewOwnerID]
OUTPUT ##ServerName AS ServerName, db_name() AS DatabaseName, $action, inserted.*, deleted.*;
PRINT '====================================================================='
PRINT 'Update report created by...'
PRINT '====================================================================='
;WITH
new_owner
AS
(
SELECT [UserID], [UserName] FROM dbo.[Users] WHERE [UserName] = N'$(NewUser)'
)
,
report_list_source
AS
(
SELECT
c.[ItemID]
, c.[Name]
, [OldOwner] = ou.[UserName]
, [OldOwnerID] = ou.[UserID]
, [NewOwner] = nu.[UserName]
, [NewOwnerID] = nu.[UserID]
FROM
dbo.[Catalog] AS c
INNER JOIN dbo.[Users] AS ou ON ou.[UserID] = c.[CreatedById]
, new_owner AS nu
WHERE
1=1
AND ou.[UserName] = N'$(OldUser)'
AND c.[Type] = 2
)
--SELECT * FROM report_list_source
MERGE dbo.[Catalog] AS T
USING report_list_source AS S ON T.[ItemID] = S.[ItemID]
WHEN MATCHED
THEN UPDATE SET
T.[CreatedById] = S.[NewOwnerID]
OUTPUT ##ServerName AS ServerName, db_name() AS DatabaseName, $action, inserted.*, deleted.*;
PRINT '====================================================================='
PRINT 'Update report modified by...'
PRINT '====================================================================='
;WITH
new_owner
AS
(
SELECT [UserID], [UserName] FROM dbo.[Users] WHERE [UserName] = N'$(NewUser)'
)
,
report_list_source
AS
(
SELECT
c.[ItemID]
, c.[Name]
, [OldOwner] = ou.[UserName]
, [OldOwnerID] = ou.[UserID]
, [NewOwner] = nu.[UserName]
, [NewOwnerID] = nu.[UserID]
FROM
dbo.[Catalog] AS c
INNER JOIN dbo.[Users] AS ou ON ou.[UserID] = c.[ModifiedById]
, new_owner AS nu
WHERE
1=1
AND ou.[UserName] = N'$(OldUser)'
AND c.[Type] = 2
)
--SELECT * FROM report_list_source
MERGE dbo.[Catalog] AS T
USING report_list_source AS S ON T.[ItemID] = S.[ItemID]
WHEN MATCHED
THEN UPDATE SET
T.[ModifiedById] = S.[NewOwnerID]
OUTPUT ##ServerName AS ServerName, db_name() AS DatabaseName, $action, inserted.*, deleted.*;
PRINT '******* ROLLBACK TRANSACTION ******* ';
ROLLBACK TRANSACTION;
--PRINT '******* COMMIT TRANSACTION ******* ';
--COMMIT TRANSACTION;
PRINT '====================================================================='
PRINT 'Finished...'
PRINT '====================================================================='
To answer your second question, I wrote a report to view all the subscriptions. Below is the report SQL. Here is the rdl file if you just want to download that.
/*'------------------------------------------------------------------------------------------------------------------
| Purpose: Schedule Of Recurring Report Subscriptions
| Note: SQLCmdMode Script
'--------------------------------------------------------------------------------------------------------------------
DECLARE #all_value AS VARCHAR(100)
DECLARE #ReportFolder AS VARCHAR(100)
DECLARE #ReportName AS VARCHAR(100)
DECLARE #EmailLike AS VARCHAR(100)
DECLARE #ModifiedBy AS VARCHAR(50)
DECLARE #SubcriptionOwner AS VARCHAR(50)
DECLARE #SubscriptionStatus AS VARCHAR(1)
DECLARE #EventStatus AS VARCHAR(50)
DECLARE #Current AS VARCHAR(50)
DECLARE #LastSubscriptionDate AS DATETIME
SET #all_value = '<ALL>'
SET #ReportFolder = '<ALL>'
SET #ReportName = '<ALL>'
SET #EmailLike = NULL
SET #ModifiedBy = NULL
SET #SubcriptionOwner = NULL
SET #SubscriptionStatus = 'A' -- Y=Sent, N=Fail, A=All
SET #EventStatus = '<ALL>' -- status from ReportServer.dbo.ExecutionLog
SET #Current = '<ALL>'
SET #LastSubscriptionDate = NULL --getdate()-1
*/
;WITH
report_users
AS
(
SELECT [UserID], [UserName], [SimpleUserName] = UPPER(RIGHT([UserName],(LEN([UserName])-CHARINDEX('\',[UserName])))) FROM dbo.[Users]
)
,
report_catalog
AS
(
SELECT
c.[ItemID]
, c.[CreatedById]
, c.[ModifiedById]
, c.[Type]
, c.[Name]
, c.[Description]
, c.[Parameter]
, [ReportCreationDate] = CONVERT(DATETIME, CONVERT(VARCHAR(11), c.[CreationDate], 13))
, [ReportModifiedDate] = CONVERT(DATETIME, CONVERT(VARCHAR(11), c.[ModifiedDate], 13))
, [ReportFolder] =
CASE
WHEN c.[Path] = '/' + c.[Name] THEN ''
ELSE SUBSTRING(c.[Path], 2, Len(c.[Path])-Len(c.[Name])-2)
END
, [ReportPath] = c.[Path]
, [UrlPath] = 'http://' + Host_Name() + '/Reports/Pages/Folder.aspx?ItemPath=%2f'
, [ReportDefinition] = CONVERT(VARCHAR(MAX),CONVERT(VARBINARY(MAX), c.[Content]))
FROM
dbo.[Catalog] AS c
WHERE c.[Type] = 2
)
,
subscription_days
AS
(
SELECT tbl.* FROM (VALUES
( 'DaysOfMonth', 1, '1')
, ( 'DaysOfMonth', 2, '2')
, ( 'DaysOfMonth', 4, '3')
, ( 'DaysOfMonth', 8, '4')
, ( 'DaysOfMonth', 16, '5')
, ( 'DaysOfMonth', 32, '6')
, ( 'DaysOfMonth', 64, '7')
, ( 'DaysOfMonth', 128, '8')
, ( 'DaysOfMonth', 256, '9')
, ( 'DaysOfMonth', 512, '10')
, ( 'DaysOfMonth', 1024, '11')
, ( 'DaysOfMonth', 2048, '12')
, ( 'DaysOfMonth', 4096, '13')
, ( 'DaysOfMonth', 8192, '14')
, ( 'DaysOfMonth', 16384, '15')
, ( 'DaysOfMonth', 32768, '16')
, ( 'DaysOfMonth', 65536, '17')
, ( 'DaysOfMonth', 131072, '18')
, ( 'DaysOfMonth', 262144, '19')
, ( 'DaysOfMonth', 524288, '20')
, ( 'DaysOfMonth', 1048576, '21')
, ( 'DaysOfMonth', 2097152, '22')
, ( 'DaysOfMonth', 4194304, '23')
, ( 'DaysOfMonth', 8388608, '24')
, ( 'DaysOfMonth', 16777216, '25')
, ( 'DaysOfMonth', 33554432, '26')
, ( 'DaysOfMonth', 67108864, '27')
, ( 'DaysOfMonth', 134217728, '28')
, ( 'DaysOfMonth', 268435456, '29')
, ( 'DaysOfMonth', 536870912, '30')
, ( 'DaysOfMonth', 1073741824, '31')
, ( 'DaysOfMonth', 8193, '1st and 14th')
, ( 'DaysOfWeek', 1, 'Sun')
, ( 'DaysOfWeek', 2, 'Mon')
, ( 'DaysOfWeek', 4, 'Tues')
, ( 'DaysOfWeek', 8, 'Wed')
, ( 'DaysOfWeek', 16, 'Thurs')
, ( 'DaysOfWeek', 32, 'Fri')
, ( 'DaysOfWeek', 64, 'Sat')
, ( 'DaysOfWeek', 62, 'Mon - Fri')
, ( 'DaysOfWeek', 10, 'Mon - Wed')
, ( 'DaysOfWeek', 24, 'Wed - Thurs')
, ( 'DaysOfWeek', 120, 'Wed - Sat')
, ( 'DaysOfWeek', 126, 'Mon - Sat')
, ( 'DaysOfWeek', 127, 'Daily')
, ( 'DayOfWeek', 1, 'Sun')
, ( 'DayOfWeek', 127, 'Sun')
, ( 'DayOfWeek', 2, 'Mon')
, ( 'DayOfWeek', 10, 'Mon')
, ( 'DayOfWeek', 62, 'Mon')
, ( 'DayOfWeek', 126, 'Mon')
, ( 'DayOfWeek', 127, 'Mon')
, ( 'DayOfWeek', 4, 'Tue')
, ( 'DayOfWeek', 10, 'Tue')
, ( 'DayOfWeek', 62, 'Tue')
, ( 'DayOfWeek', 126, 'Tue')
, ( 'DayOfWeek', 127, 'Tue')
, ( 'DayOfWeek', 8, 'Wed')
, ( 'DayOfWeek', 10, 'Wed')
, ( 'DayOfWeek', 24, 'Wed')
, ( 'DayOfWeek', 62, 'Wed')
, ( 'DayOfWeek', 120, 'Wed')
, ( 'DayOfWeek', 126, 'Wed')
, ( 'DayOfWeek', 127, 'Wed')
, ( 'DayOfWeek', 16, 'Thr')
, ( 'DayOfWeek', 24, 'Thr')
, ( 'DayOfWeek', 62, 'Thr')
, ( 'DayOfWeek', 120, 'Thr')
, ( 'DayOfWeek', 126, 'Thr')
, ( 'DayOfWeek', 127, 'Thr')
, ( 'DayOfWeek', 32, 'Fri')
, ( 'DayOfWeek', 62, 'Fri')
, ( 'DayOfWeek', 120, 'Fri')
, ( 'DayOfWeek', 126, 'Fri')
, ( 'DayOfWeek', 127, 'Fri')
, ( 'DayOfWeek', 64, 'Sat')
, ( 'DayOfWeek', 120, 'Sat')
, ( 'DayOfWeek', 126, 'Sat')
, ( 'DayOfWeek', 127, 'Sat')
) tbl ([GroupName], [CodeNbr], [Label])
)
,
subscription_schedule
AS
(
SELECT
[ScheduleID]
, [SchDaySun] = Sun
, [SchDayMon] = Mon
, [SchDayTue] = Tue
, [SchDayWed] = Wed
, [SchDayThr] = Thr
, [SchDayFri] = Fri
, [SchDaySat] = Sat
, [ScheduleName]
, [ScheduleStartDate]
, [ScheduleEndDate]
, [Flags]
, [RecurrenceType]
, [State]
, [MinutesInterval]
, [DaysInterval]
, [WeeksInterval]
, [DaysOfWeek]
, [DaysOfMonth]
, [Month]
, [MonthlyWeek]
, [ScheduleDays]
FROM
(
SELECT
sc.[ScheduleID]
, sd.[CodeNbr]
, sd.[Label]
, [ScheduleName] = sc.[name]
, [ScheduleStartDate] = sc.[StartDate]
, [ScheduleEndDate] = sc.[EndDate]
, sc.[Flags]
, sc.[RecurrenceType]
, sc.[State]
, sc.[MinutesInterval]
, sc.[DaysInterval]
, sc.[WeeksInterval]
, sc.[DaysOfWeek]
, sc.[DaysOfMonth]
, sc.[Month]
, sc.[MonthlyWeek]
, [ScheduleDays] =
CASE
WHEN sc.[DaysOfMonth] IS NOT NULL THEN COALESCE(dom.[Label], '(' + CAST(sc.[DaysOfMonth] AS VARCHAR(20)) + ') NOT CODED')
WHEN sc.[DaysOfWeek] IS NOT NULL THEN COALESCE(dow.[Label], '(' + CAST(sc.[DaysOfWeek] AS VARCHAR(20)) + ') NOT CODED')
END
--, sc.[RecurrenceType]
FROM
dbo.[Schedule] sc
LEFT JOIN subscription_days sd ON sc.[DaysOfWeek] = sd.[CodeNbr] AND sd.[GroupName] = 'DayOfWeek'
LEFT JOIN subscription_days AS dom ON sc.[DaysOfMonth] = dom.[CodeNbr] AND dom.[GroupName] = 'DaysOfMonth'
LEFT JOIN subscription_days AS dow ON sc.DaysOfWeek = dow.CodeNbr AND dow.[GroupName] = 'DaysOfWeek'
) sch
PIVOT
(
COUNT(sch.[Label])
FOR sch.[Label]
IN ([Sun], [Mon], [Tue], [Wed], [Thr], [Fri], [Sat])
) AS pvt
)
,
report_subscription
AS
(
SELECT
s.[SubscriptionID]
, s.[Report_OID]
, [SubscriptionDescription] = s.[Description]
, s.[ExtensionSettings]
, s.[EventType]
, s.[OwnerID]
, s.[ModifiedByID]
, s.[ModifiedDate]
, [RunTime] = CONVERT(VARCHAR(5), s.[LastRunTime], 8)
, [LastRunDate] = CONVERT(VARCHAR(11),s.[LastRunTime],13)
, s.[LastRunTime]
, s.[DeliveryExtension]
, s.[MatchData]
, [SubscriptionLastStatus] = s.[LastStatus]
, [StatusFail] = CASE WHEN s.[LastStatus] LIKE '%Mail sent%' THEN 'N' ELSE 'Y' END
, [EmailSubject] = CASE CHARINDEX('<Name>SUBJECT</Name><Value>', s.ExtensionSettings) WHEN 0 THEN '' ELSE SUBSTRING(s.ExtensionSettings, LEN('<Name>SUBJECT</Name><Value>') + CHARINDEX('<Name>SUBJECT</Name><Value>', s.ExtensionSettings), CHARINDEX('</Value>', s.ExtensionSettings, CHARINDEX('<Name>SUBJECT</Name><Value>', s.ExtensionSettings) + 1) - (LEN('<Name>SUBJECT</Name><Value>') + CHARINDEX('<Name>SUBJECT</Name><Value>', s.ExtensionSettings))) END
, [EmailTo] = SUBSTRING(s.ExtensionSettings, LEN('<Name>TO</Name><Value>') + CHARINDEX('<Name>TO</Name><Value>', s.ExtensionSettings), CHARINDEX('</Value>', s.ExtensionSettings, CHARINDEX('<Name>TO</Name><Value>', s.ExtensionSettings) + 1) - (LEN('<Name>TO</Name><Value>') + CHARINDEX('<Name>TO</Name><Value>', s.ExtensionSettings)))
, [EmailCc] = CASE CHARINDEX('<Name>CC</Name><Value>', s.ExtensionSettings) WHEN 0 THEN '' ELSE SUBSTRING(s.ExtensionSettings, LEN('<Name>CC</Name><Value>') + CHARINDEX('<Name>CC</Name><Value>', s.ExtensionSettings), CHARINDEX('</Value>', s.ExtensionSettings, CHARINDEX('<Name>CC</Name><Value>', s.ExtensionSettings) + 1) - (LEN('<Name>CC</Name><Value>') + CHARINDEX('<Name>CC</Name><Value>', s.ExtensionSettings))) END
, [EmailBcc] = CASE CHARINDEX('<Name>BCC</Name><Value>', s.ExtensionSettings) WHEN 0 THEN '' ELSE SUBSTRING(s.ExtensionSettings, LEN('<Name>BCC</Name><Value>') + CHARINDEX('<Name>BCC</Name><Value>', s.ExtensionSettings), CHARINDEX('</Value>', s.ExtensionSettings, CHARINDEX('<Name>BCC</Name><Value>', s.ExtensionSettings) + 1) - (LEN('<Name>BCC</Name><Value>') + CHARINDEX('<Name>BCC</Name><Value>', s.ExtensionSettings))) END
, [EmailComment] = CASE CHARINDEX('<Name>Comment</Name><Value>', s.ExtensionSettings) WHEN 0 THEN '' ELSE SUBSTRING(s.ExtensionSettings, LEN('<Name>Comment</Name><Value>') + CHARINDEX('<Name>Comment</Name><Value>', s.ExtensionSettings), CHARINDEX('</Value>', s.ExtensionSettings, CHARINDEX('<Name>Comment</Name><Value>', s.ExtensionSettings) + 1) - (LEN('<Name>Comment</Name><Value>') + CHARINDEX('<Name>Comment</Name><Value>', s.ExtensionSettings))) END
, [EmailIncludeLink] = CASE CHARINDEX('<Name>IncludeLink</Name><Value>', s.ExtensionSettings) WHEN 0 THEN '' ELSE SUBSTRING(s.ExtensionSettings, LEN('<Name>IncludeLink</Name><Value>') + CHARINDEX('<Name>IncludeLink</Name><Value>', s.ExtensionSettings), CHARINDEX('</Value>', s.ExtensionSettings, CHARINDEX('<Name>IncludeLink</Name><Value>', s.ExtensionSettings) + 1) - (LEN('<Name>IncludeLink</Name><Value>') + CHARINDEX('<Name>IncludeLink</Name><Value>', s.ExtensionSettings))) END
, [EmailRenderFormat] = CASE CHARINDEX('<Name>RenderFormat</Name><Value>', s.ExtensionSettings) WHEN 0 THEN '' ELSE SUBSTRING(s.ExtensionSettings, LEN('<Name>RenderFormat</Name><Value>') + CHARINDEX('<Name>RenderFormat</Name><Value>', s.ExtensionSettings), CHARINDEX('</Value>', s.ExtensionSettings, CHARINDEX('<Name>RenderFormat</Name><Value>', s.ExtensionSettings) + 1) - (LEN('<Name>RenderFormat</Name><Value>') + CHARINDEX('<Name>RenderFormat</Name><Value>', s.ExtensionSettings))) END
, [EmailPriority] = CASE CHARINDEX('<Name>Priority</Name><Value>', s.ExtensionSettings) WHEN 0 THEN '' ELSE SUBSTRING(s.ExtensionSettings, LEN('<Name>Priority</Name><Value>') + CHARINDEX('<Name>Priority</Name><Value>', s.ExtensionSettings), CHARINDEX('</Value>', s.ExtensionSettings, CHARINDEX('<Name>Priority</Name><Value>', s.ExtensionSettings) + 1) - (LEN('<Name>Priority</Name><Value>') + CHARINDEX('<Name>Priority</Name><Value>', s.ExtensionSettings))) END
, sch.[MinutesInterval]
, sch.[DaysInterval]
, sch.[WeeksInterval]
, sch.[DaysOfWeek]
, sch.[DaysOfMonth]
, sch.[Month]
, sch.[MonthlyWeek]
--, [JobName] = sj.[name]
, sch.[ScheduleName]
, sch.[ScheduleDays]
, sch.[SchDaySun]
, sch.[SchDayMon]
, sch.[SchDayTue]
, sch.[SchDayWed]
, sch.[SchDayThr]
, sch.[SchDayFri]
, sch.[SchDaySat]
, sch.[ScheduleStartDate]
, sch.[ScheduleEndDate]
, sch.[Flags]
, sch.[RecurrenceType]
, sch.[State]
FROM
dbo.[Subscriptions] AS s
LEFT JOIN dbo.[Notifications] AS n ON n.[SubscriptionID] = s.[SubscriptionID] AND s.[Report_OID] = n.[ReportID]
LEFT JOIN dbo.[ReportSchedule] AS rs ON s.[SubscriptionID] = rs.[SubscriptionID]
--LEFT JOIN MSDB.dbo.[sysjobs] AS sj ON sj.[name] = CAST(rs.[ScheduleID] AS VARCHAR(255))
LEFT JOIN subscription_schedule AS sch ON rs.[ScheduleID] = sch.[ScheduleID]
WHERE
1=1
--AND sch.[RecurrenceType] IN(4,5) -- 1 = is one off, 4 = daily, 5 = monthly
--AND s.EventType = 'TimedSubscription'
)
SELECT
c.[Name]
, c.[Description]
, c.[Parameter]
, c.[ReportFolder]
, c.[ReportPath]
, [URL_ReportFolder] = c.[UrlPath] + c.[ReportFolder] + '&ViewMode=List'
, [URL_Report] = c.[UrlPath] + c.[ReportFolder] + '%2f' + c.Name
, [URL] = 'http://' + Host_Name() + '/Reports/Pages/SubscriptionProperties.aspx?ItemPath=' + c.ReportPath + '&IsDataDriven=False&SubscriptionID=' + CAST(s.SubscriptionID AS VARCHAR(80))
, [URL2] = 'http://' + Host_Name() + '/Reports/Pages/Report.aspx?ItemPath=' + c.[ReportPath] + '&SelectedTabId=SubscriptionsTab'
, [ReportCreatedBy] = urc.[SimpleUserName]
, c.[ReportCreationDate]
, [ReportModifiedBy] = urm.[SimpleUserName]
, c.[ReportModifiedDate]
, [SubscriptionOwner] = usc.[SimpleUserName]
, [SubscriptionModifiedBy] = usm.[SimpleUserName]
, [SubscriptionModifiedDate] = s.[ModifiedDate]
, s.[SubscriptionID]
, s.[SubscriptionDescription]
, s.[ExtensionSettings]
, s.[EventType]
, s.[EmailSubject]
, s.[EmailTo]
, s.[EmailCc]
, s.[EmailBcc]
, s.[EmailComment]
, s.[EmailIncludeLink]
, s.[EmailRenderFormat]
, s.[EmailPriority]
, s.[DeliveryExtension]
, s.[SubscriptionLastStatus]
, s.[StatusFail]
, s.[MatchData]
, s.[RunTime]
, s.[LastRunDate]
, s.[LastRunTime]
, s.[MinutesInterval]
, s.[DaysInterval]
, s.[WeeksInterval]
, s.[DaysOfWeek]
, s.[DaysOfMonth]
, s.[Month]
, s.[MonthlyWeek]
, [JobName] = NULL --, s.[JobName]
, s.[ScheduleName]
, s.[ScheduleDays]
, s.[SchDaySun]
, s.[SchDayMon]
, s.[SchDayTue]
, s.[SchDayWed]
, s.[SchDayThr]
, s.[SchDayFri]
, s.[SchDaySat]
, s.[ScheduleStartDate]
, s.[ScheduleEndDate]
, s.[Flags]
, s.[RecurrenceType]
, s.[State]
, [EventStatus] = el.[Status]
, [EventDateTime] = el.[TimeEnd]
FROM
report_catalog AS c
INNER JOIN report_subscription AS s ON s.[Report_OID] = c.[ItemID]
LEFT OUTER JOIN (SELECT b.[ReportID], b.[Status], b.[TimeEnd]
FROM dbo.[ExecutionLog] b
INNER JOIN (SELECT [ReportID], MAX([TimeEnd]) AS [TimeEnd]
FROM dbo.[ExecutionLog]
GROUP BY [ReportID]) a ON b.[ReportID] = a.[ReportID] AND b.[TimeEnd] = a.[TimeEnd]
)AS el ON el.[ReportID] = c.[ItemID]
LEFT OUTER JOIN report_users AS urc ON c.[CreatedById] = urc.[UserID]
LEFT OUTER JOIN report_users AS urm ON c.[ModifiedById] = urm.[UserID]
LEFT OUTER JOIN report_users AS usc ON s.[OwnerID] = usc.[UserID]
LEFT OUTER JOIN report_users AS usm ON s.[ModifiedByID] = usm.[UserID]
WHERE
1=1
AND c.[Type] = 2
AND (#all_value IN (#ReportFolder) OR c.[ReportFolder] IN(#ReportFolder))
AND (#all_value IN (#ReportFolder) OR CHARINDEX(#ReportFolder, c.[ReportPath]) > 0)
AND (#all_value IN(#ReportName) OR c.[Name] IN(#ReportName))
AND (#all_value IN(#EventStatus) OR el.[Status] IN(#EventStatus))
AND (#all_value IN(#Current) OR CASE WHEN s.[ScheduleEndDate] IS NULL THEN 'Current' WHEN s.[ScheduleEndDate] IS NOT NULL THEN 'Non Current' END = #Current)
AND (#all_value IN(#SubscriptionStatus) OR s.[SubscriptionLastStatus] LIKE '%' + #SubscriptionStatus + '%')
AND (s.[LastRunTime] >= #LastSubscriptionDate OR #LastSubscriptionDate IS NULL)
AND
(
(SUBSTRING(s.[ExtensionSettings], LEN('<Name>TO</Name><Value>') + CHARINDEX('<Name>TO</Name><Value>', s.[ExtensionSettings]), CHARINDEX('</Value>', s.[ExtensionSettings], CHARINDEX('<Name>TO</Name><Value>', s.[ExtensionSettings]) + 1) - (LEN('<Name>TO</Name><Value>') + CHARINDEX('<Name>TO</Name><Value>', s.[ExtensionSettings])))
LIKE '%' + #EmailLike + '%' OR #EmailLike IS NULL
)
OR
(
CASE CHARINDEX('<Name>CC</Name><Value>', s.ExtensionSettings)
WHEN 0 THEN ''
ELSE SUBSTRING(s.ExtensionSettings, LEN('<Name>CC</Name><Value>') + CHARINDEX('<Name>CC</Name><Value>', s.ExtensionSettings), CHARINDEX('</Value>', s.ExtensionSettings, CHARINDEX('<Name>CC</Name><Value>', s.ExtensionSettings) + 1) - (LEN('<Name>CC</Name><Value>') + CHARINDEX('<Name>CC</Name><Value>', s.[ExtensionSettings])))
END
LIKE '%' + #EmailLike + '%'
)
OR
(
CASE CHARINDEX('<Name>BCC</Name><Value>', s.[ExtensionSettings])
WHEN 0 THEN ''
ELSE SUBSTRING(s.[ExtensionSettings], LEN('<Name>BCC</Name><Value>') + CHARINDEX('<Name>BCC</Name><Value>', s.ExtensionSettings), CHARINDEX('</Value>', s.[ExtensionSettings], CHARINDEX('<Name>BCC</Name><Value>', s.[ExtensionSettings]) + 1) - (LEN('<Name>BCC</Name><Value>') + CHARINDEX('<Name>BCC</Name><Value>', s.[ExtensionSettings])))
END
LIKE '%' + #EmailLike + '%')
)
To answer your third question, I would use roles in the report folders to manage permissions.
In SSRS, new roles and adjustments to existing roles must be performed in SQL Server Management studio, SSMS. After opening up SSMS, click on "Connect" and select "Reporting Services…"
Enter your Server Name and login information and then click Connect.
After connecting to the Report Server, open the Security Folder right click on "Roles" and click on "New Role…"
You can create a new role Subscription Editor or Functional Owner and then you can assign permissions to the new roles based on what you want the user(s) to be able to do.
Then on the report manager click on the down arrow for a folder and select "Security"
Then click "New Role Assignment"
Then enter the Active Directory group or an email address and check the new role you created.
Here is a more detailed wiki I wrote for report server permission on MSDN.

Combining Two SQL Select Queries with Where Clauses

I have two Oracle queries that I need combined through an inner join where the tables are joined using the person_uid field. This is because I need to compare what an employee's pay, job title, and supervisor was from one year to the next. I need to have the 2015 data and the 2014 data in the same row for each employee, so if this can be done by doing a subquery using an inner join on the person_uid field, that is the method that I believe will accomplish this.
Here is the first query that pulls the necessary 2015 data:
SELECT person_uid,
id ,
position_contract_type,
position,
job_suffix,
position_status,
effective_date,
position_employee_class,
timesheet_organization ,
appointment_pct ,
annual_salary ,
per_pay_salary ,
hourly_rate ,
position_title ,
academic_title ,
supervisor_id ,
supervisor_name ,
supervisor_position ,
supervisor_job_suffix ,
supervisor_title ,
assignment_grade ,
position_change_reason ,
position_change_reason_desc
FROM employee_position_cunm posn
WHERE posn.position_contract_type = 'P'
AND posn.position_status <> 'T'
AND posn.effective_date = (SELECT MAX(effective_date)
FROM employee_position_cunm p2
WHERE p2.person_uid = posn.person_uid
AND p2.position = posn.position
AND p2.job_suffix = posn.job_suffix
AND p2.effective_date <= '01-Nov-2015')
order by person_uid
I need it to be joined to this query on the person_uid field so that each unique ID for the employee has the records for both years in a single row:
SELECT person_uid,
id ,
position_contract_type,
position,
job_suffix,
position_status,
effective_date,
position_employee_class,
timesheet_organization ,
appointment_pct ,
annual_salary ,
per_pay_salary ,
hourly_rate ,
position_title ,
academic_title ,
supervisor_id ,
supervisor_name ,
supervisor_position ,
supervisor_job_suffix ,
supervisor_title ,
assignment_grade ,
position_change_reason ,
position_change_reason_desc
FROM employee_position_cunm posn
WHERE posn.position_contract_type = 'P'
AND posn.position_status <> 'T'
AND posn.effective_date = (SELECT MAX(effective_date)
FROM employee_position_cunm p2
WHERE p2.person_uid = posn.person_uid
AND p2.position = posn.position
AND p2.job_suffix = posn.job_suffix
AND p2.effective_date <= '01-Nov-2014')
order by person_uid
An easy way would be to use OR:
WHERE posn.position_contract_type = 'P' AND
posn.position_status <> 'T' AND
(posn.effective_date = (SELECT MAX(effective_date)
FROM employee_position_cunm p2
WHERE p2.person_uid = posn.person_uid
p2.position = posn.position AND
p2.job_suffix = posn.job_suffix AND
p2.effective_date <= '01-Nov-2014'
) OR
posn.effective_date = (SELECT MAX(effective_date)
FROM employee_position_cunm p2
WHERE p2.person_uid = posn.person_uid
p2.position = posn.position AND
p2.job_suffix = posn.job_suffix AND
p2.effective_date <= '01-Nov-2015'
)
)
In Oracle you could do a UNION or a UNION ALL.
SELECT person_uid,
id ,
position_contract_type,
position,
job_suffix,
position_status,
effective_date,
position_employee_class,
timesheet_organization ,
appointment_pct ,
annual_salary ,
per_pay_salary ,
hourly_rate ,
position_title ,
academic_title ,
supervisor_id ,
supervisor_name ,
supervisor_position ,
supervisor_job_suffix ,
supervisor_title ,
assignment_grade ,
position_change_reason ,
position_change_reason_desc
FROM employee_position_cunm posn
WHERE ...
...
...
UNION ALL
SELECT person_uid,
id ,
position_contract_type,
position,
job_suffix,
position_status,
effective_date,
position_employee_class,
timesheet_organization ,
appointment_pct ,
annual_salary ,
per_pay_salary ,
hourly_rate ,
position_title ,
academic_title ,
supervisor_id ,
supervisor_name ,
supervisor_position ,
supervisor_job_suffix ,
supervisor_title ,
assignment_grade ,
position_change_reason ,
position_change_reason_desc
FROM employee_position_cunm posn
WHERE ....
....
....;

output sql data to html with hyperlink

I have below query that converts sql result to HTML
DECLARE #BODY VARCHAR(MAX)
SET #BODY = CAST((
SELECT td = entity + '</td><td>' + procname + '</td><td>' + exedate + '</td><td>' + rowcnt + '</td><td>' +
cont + '</td><td>' + fpath from (
SELECT entity = ENTITY , procname = PROC_NAME,exedate = EXEC_DATE, rowcnt = ROW_COUNT,
cont = CONTENT, fpath = FILEPATH FROM HTML_OUTPUTFOREMAIL) AS D
for xml path('tr'),type) as varchar(max))
set #BODY = '<tr><h1>SUMMARY TABLE</h1>'
+'<table cellpadding="2" cellspacing="2" border="1">'
+'<tr><th>ENTITY</th><th>PROC_NAME</th><th>EXEC_DATE</th><th>ROW_COUNT</th><th>CONTENT</th><th>FILEPATH</th><tr>'
+ REPLACE(replace(#body,'<','<'),'>','>')
+'<table>'
print #body
In this data I have a column "fpath" that contains link to the HTML file. But I want the result of this column in a hyperlink.
This is not really SQL Server jobs to output HTML.
If you have to create it this way, you can generate the whole table with FOR XML Explicit.
I am just creating a dummy table with 4 line here and dummy data. You still have to change columns name or add more.
declare #t table(id int, entity varchar(10), name varchar(10), fpath varchar(50), link_name varchar(10), exec_date datetime)
insert into #t(id, entity, name, fpath, link_name, exec_date) values
(1, 'ent1', 'A', 'google.com', 'linkA', '20150115')
, (2, 'ent2', 'B', 'google.com', 'linkB', '20150215')
, (3, 'ent3', 'C', 'google.com', 'linkC', '20150315')
, (4, 'ent4', 'D', 'google.com', 'linkD', '20150415')
Select Tag, Parent
, [Table] as 'Table!1!'
, [entity] as 'TR!2!TD!Element'
, [name] as 'TR!2!TD!Element'
, [exec_date] as 'TR!2!TD!Element'
, [TD] as 'TD!3!TD!Element'
, [href] as 'A!4!href'
, [target] as 'A!4!target'
, [link] as 'A!4!'
From(
Select 1 as Tag, NULL as Parent, 0 as sort
, NULL as 'Table'
, NULL as 'entity'
, NULL as 'name'
, NULL as 'exec_date'
, NULL as 'TD'
, NULL as 'href'
, NULL as 'link'
, NULL as 'Target'
Union All
Select 2 as Tag, 1 as Parent, id*10 as sort
, NULL
, entity
, name
, cast(exec_date as varchar(50))
, NULL
, NULL
, NULL
, NULL
From #t
Union All
Select 3 as Tag, 2 as Parent, id*10+1 as sort
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
, NULL
From #t
Union All
Select 4 as Tag, 3 as Parent, id*10+2
, NULL
, NULL
, NULL
, NULL
, NULL
, fpath
, link_name
, '_blank'
From #t
) X
Order By sort
For XML EXplicit