Labels

Apache Hadoop (3) ASP.NET (2) AWS S3 (2) Batch Script (3) BigQuery (21) BlobStorage (1) C# (3) Cloudera (1) Command (2) Data Model (3) Data Science (1) Django (1) Docker (1) ETL (7) Google Cloud (5) GPG (2) Hadoop (2) Hive (3) Luigi (1) MDX (21) Mongo (3) MYSQL (3) Pandas (1) Pentaho Data Integration (5) PentahoAdmin (13) Polybase (1) Postgres (1) PPS 2007 (2) Python (13) R Program (1) Redshift (3) SQL 2016 (2) SQL Error Fix (18) SQL Performance (1) SQL2012 (7) SQOOP (1) SSAS (20) SSH (1) SSIS (42) SSRS (17) T-SQL (75) Talend (3) Vagrant (1) Virtual Machine (2) WinSCP (1)

Friday, February 25, 2011

Named Set for Current Month calculation

WITH SET [Calendar Months]
AS EXTRACT(STRTOMEMBER("[Date].[Month].&["+cstr(month(NOW()))+"]",CONSTRAINED)
*{[Date].[Calendar Period].[Month]},[Date].[Calendar Period])
SELECT NON Empty[Calendar Months]  on Rows, [Measures].[Actual Amount] on Columns FROM [Sales]

Thursday, February 17, 2011

Cross Apply and Outer Apply in SQL

DECLARE @Year INT
SET @Year = 2008

SELECT  ISNULL(ROUND(a.SalesAmount,0),0) AS CurrentSales
                     , ISNULL(ROUND(b.SalesAmount,0),0) As PreviousSales
                     ,a.MONTH As 'Month'
            FROM
                      (SELECT    SUM(Fs.SalesAmt) AS SalesAmount
                          ,DD.MonthName AS 'Month'
                           ,DD.MonthNumber
                              FROM    FactSales FS
                              JOIN     DimDate DD on DD.DateKey = FS.DateKey
                              WHERE    DD.Year = @Year
                              GROUP BY DD.MonthName
                           ,DD.MonthNumber
                          ) AS a
             OUTER APPLY
             --CROSS APPLY
                         (SELECT    Sum(Fs.SalesAmt) AS SalesAmount
                                      ,DD.MONTHNAME AS 'Month'
                                      ,DD.MonthNumber
                        FROM    FactSales FS
                        JOIN     DimDate DD ON DD.DateKey = FS.DateKey
                        WHERE     DD.Year = @Year - 1
                                    and   DD.MonthNumber = a.MonthNumber
                        GROUP BY DD.MONTHNAME
                           ,DD.MonthNumber
                         ) AS b

Consider ther is no data for year 2007, then on replacing ‘Outer Apply’ with ‘Cross Apply’ no data will be displayed. But using Outer Apply will display data for the year 2008 (current Sales) and 0 for 2007 (Previous Sales)

XMLA Script to Process SSAS 2005 and 2008 Cubes


To Process SSAS 2008 Database
<Batch xmlns="http://schemas.microsoft.com/analysisservices/2003/engine">
  <Parallel>
    <Process xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ddl2="http://schemas.microsoft.com/analysisservices/2003/engine/2" xmlns:ddl2_2="http://schemas.microsoft.com/analysisservices/2003/engine/2/2" xmlns:ddl100_100="http://schemas.microsoft.com/analysisservices/2008/engine/100/100">
      <Object>
        <DatabaseID>Mercury_HelpDesk</DatabaseID>
      </Object>
      <Type>ProcessFull</Type>
      <WriteBackTableCreation>UseExisting</WriteBackTableCreation>
    </Process>
  </Parallel>
</Batch>

To Process SSAS 2005 Database
<Batch xmlns="http://schemas.microsoft.com/analysisservices/2003/engine">
  <Parallel>
    <Process xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ddl2="http://schemas.microsoft.com/analysisservices/2003/engine/2" xmlns:ddl2_2="http://schemas.microsoft.com/analysisservices/2003/engine/2/2">
      <Object>
        <DatabaseID>CIT Global WareHouse</DatabaseID>
      </Object>
      <Type>ProcessFull</Type>
      <WriteBackTableCreation>UseExisting</WriteBackTableCreation>
    </Process>
  </Parallel>
</Batch>


XMLA Script to Process cube through variable supplied

"<Batch xmlns=\"http://schemas.microsoft.com/analysisservices/2003/engine/">
  <Parallel>
    <Process xmlns:xsd=\"http://www.w3.org/2001/XMLSchema/" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance/" xmlns:ddl2=\"http://schemas.microsoft.com/analysisservices/2003/engine/2/" xmlns:ddl2_2=\"http://schemas.microsoft.com/analysisservices/2003/engine/2/2/" xmlns:ddl100_100=\"http://schemas.microsoft.com/analysisservices/2008/engine/100/100/">
<Object>
<DatabaseID>"+ @[User::CubeDatabase] +"</DatabaseID>
      </Object>
      <Type>ProcessFull</Type>
      <WriteBackTableCreation>UseExisting</WriteBackTableCreation>
    </Process>
  </Parallel>
</Batch>"

Wednesday, February 16, 2011

SQL Function to Display Text with Sentence Caps

Below Query creates a function to display the text in sentence caps, e.g.., displays 'ANANDH KUMAR' as 'Anandh Kumar'

CREATE FUNCTION [dbo].[ProperCase](@Input AS VARCHAR(8000))
RETURNS VARCHAR(8000)
AS
BEGIN
   DECLARE @Reset BIT;
   DECLARE @Ret VARCHAR(8000);
   DECLARE @i INT;
   DECLARE @c CHAR(1);

   SELECT @Reset = 1, @i=1, @Ret = '';
  
   WHILE (@i <= LEN(@Input))
      SELECT @c= SUBSTRING(@Input,@i,1),
               @Ret = @Ret + CASE WHEN @Reset=1 THEN UPPER(@c) ELSE LOWER(@c) END,
               @Reset = CASE WHEN @c LIKE '[a-zA-Z]' THEN 0 ELSE 1 END,
               @i = @i +1
              
   RETURN @Ret
END

SQL Query to get Last and First Day of Previous and Upcoming Period

----Last Day of Previous Month
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE()),0)) LastDay_PreviousMonth

----Last Day of Current Month
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+1,0)) LastDay_CurrentMonth

----Last Day of Next Month
SELECT DATEADD(s,-1,DATEADD(mm, DATEDIFF(m,0,GETDATE())+2,0)) LastDay_NextMonth

--First Day of Previous Month
SELECT DATEADD(mm, DATEDIFF(m,0,GETDATE())-1,0) FirstDay_PreviousMonth

--First Day of Current Month
SELECT DATEADD(mm, DATEDIFF(m,0,GETDATE()),0) FirstDay_CurrentMonth

--First Day of Next Month
SELECT DATEADD(mm, DATEDIFF(m,0,GETDATE()),0) FirstDay_NextMonth

--First Day of Prev Week
SELECT DATEADD(DAY,-1,DATEADD(WEEK, DATEDIFF(WEEK,0,GETDATE())-1,0)) FirstDay_PreviousWeek

--First Day of Current Week
SELECT DATEADD(DAY,-1,DATEADD(WEEK, DATEDIFF(WEEK,0,GETDATE()),0)) FirstDay_CurrentWeek

--First Day of Next Week
SELECT DATEADD(DAY,-1,DATEADD(WEEK, DATEDIFF(WEEK,0,GETDATE()+7),0)) FirstDay_NextWeek

--Last Day of Prev Week
SELECT DATEADD(DAY,5,DATEADD(WEEK, DATEDIFF(WEEK,0,GETDATE())-1,0)) LastDay_PreviousWeek

--Last Day of Current Week
SELECT DATEADD(DAY,5,DATEADD(WEEK, DATEDIFF(WEEK,0,GETDATE()),0)) LastDay_CurrentWeek

--Last Day of Next Week
SELECT DATEADD(DAY,5,DATEADD(WEEK, DATEDIFF(WEEK,0,GETDATE()+7),0)) LastDay_NextWeek

Tuesday, February 15, 2011

Sending Mail Alert to respective Supervisor using SQL

The below query helps you to trigger mail to respective supervisors of the empoyees containing office In-time violation details



DECLARE @LastDay_PreviousWeek DATETIME
DECLARE @FirstDay_PreviousWeek DATETIME
SELECT @LastDay_PreviousWeek = DATEADD(DAY,5,DATEADD(WEEK, DATEDIFF(WEEK,0,GETDATE())-1,0))
SELECT @FirstDay_PreviousWeek = DATEADD(DAY,-1,DATEADD(WEEK, DATEDIFF(WEEK,0,GETDATE())-1,0))

DECLARE @COUNTER INT
DECLARE @Max INT
SET @Counter = 1


DECLARE  @TEMP1 TABLE
(SNO INT, Department Varchar(255), Employee NVARCHAR(255), SupervisorName NVARCHAR(255), SupervisorKey INT, SupervisorMail NVARCHAR(255)
,[Date] DATETIME, ExpectedTime VARCHAR(20), ActualEntryTime NVARCHAR(20), GraceTime NVARCHAR(20), Status1 VARCHAR(50), Status2 VARCHAR(50))

INSERT INTO @Temp1
SELECT  DENSE_RANK() OVER (ORDER BY SupervisorEmail) AS SNO
            ,DDE.DepartmentName
            ,DE.Firstname
            ,DE.SupervisorName
            ,DE.SupervisorKey
            ,DE.SupervisorEMail
            ,DD.[Date]
            ,DE.ExpectedTime
            ,MIN(FH.EntryTime) AS ActualEntryTime
            ,CONVERT(VARCHAR(8),DATEADD(n, 10,  DE.ExpectedTime), 114) AS GraceTime
            ,CASE WHEN DE.ExpectedTime < MIN(FH.EntryTime) THEN 'Violated' ELSE 'Normal' END AS [STATUS1]
            ,CASE WHEN CONVERT(VARCHAR(8),DATEADD(n, 10,  DE.ExpectedTime), 114) <  MIN(FH.EntryTime) THEN 'Violated' ELSE 'Normal' END AS [STATUS2]
FROM [devsql2000\CITBI].[CITGlobal Warehouse].dbo.[DimEmployee] DE
JOIN [devsql2000\CITBI].[CITGlobal Warehouse].dbo.FactHolder FH ON FH.Employeekey = DE.EmployeeKey
JOIN [devsql2000\CITBI].[CITGlobal Warehouse].dbo.DimDepartment DDE ON DDE.DepartmentKey = DE.DepartmentKey
JOIN [devsql2000\CITBI].[CITGlobal Warehouse].dbo.DimDate DD ON DD.DateKey = FH.ActualInDateKey
WHERE DATEPART(Week, GETDATE())-1 = DD.[WeekOfYear]
AND DD.[year] = YEAR(GETDATE()) AND DE.DepartmentKey in (105)
GROUP BY DD.[Date]
            ,DDE.DepartmentName
            ,DE.Firstname
            ,DE.SupervisorName
            ,DE.SupervisorKey
            ,DE.ExpectedTime
            ,SupervisorEMail

SELECT @Max = (SELECT MAX(SNO) FROM @TEMP1)
--SELECT * from @Temp1

WHILE (@COUNTER <= @Max)
    BEGIN
            DECLARE @tableHTML NVARCHAR(MAX)
            DECLARE @LeadMailID NVARCHAR(MAX)
            SELECT @LeadMailID = SupervisorMail FROM @Temp1
            WHERE SNO = @COUNTER
           
            SET @tableHTML =
                  N'<span color=Red style="font-weight:bold;font-size:1.5em;font-family:Calibri;color:Red">
                  In-Time Violation Alert for Last Week </span>' +
                  '<span color=Red style="font-weight:bold;font-size:1em;font-family:Calibri;color:Red"> (From ' + CONVERT(VARCHAR(50), @FirstDay_PreviousWeek,106 ) + ' to ' + CONVERT(VARCHAR(50), @LastDay_PreviousWeek, 106 ) + ')</span>' +
                  N'<table cellspacing="0" cellpadding="5" border="1" style="font-family:Calibri">' +
                  N'<tr bgcolor="#87CEFA" style="font-weight:bold;"><td>SNo</td>' +
                  N'<td>Department</td>' +
                  N'<td>Employee</td>' +
                  N'<td>Date</td>' +
                  N'<td>Expected Time</td>' +
                  N'<td>Actual Time</td>' +
                  N'<td>Time Difference (min)</td></tr>' +
                  CAST ( ( SELECT  td = ROW_NUMBER() OVER (ORDER BY [Department], Employee,[Date]), ''
                                          ,td = [Department], ''
                                          ,td = [Employee], ''
                                          ,td = CONVERT(VARCHAR(10),[Date],101),''
                                          ,td = [ExpectedTime], ''
                                          ,td = [ActualEntryTime], ''
                                          ,td = DATEDiff(n,[ExpectedTime], [ActualEntryTime]), ''
                                FROM      (SELECT  Department
                                                       ,Employee
                                                       ,[Date]
                                                       ,ExpectedTime
                                                       ,ActualEntryTime
                                          FROM @Temp1
                                          WHERE Status2 ='Violated' AND SNO = @Counter) TT
                                          ORDER BY Department
                                                      ,Employee
                                                      ,[Date]
                                FOR XML PATH('tr'), TYPE
                  ) AS NVARCHAR(MAX) ) +
                  N'</table>' ;
                 
            --    print @tableHTML

            EXEC msdb.dbo.sp_send_dbmail
               @subject = 'Employee In-Time Violation Alert for Last Week',
               @profile_name = 'InTimeViolationAlert',
               @recipients = @LeadMailID,
               @copy_recipients = 'mahadevan.v@congruentindia.com',
                 @body = @tableHTML,
                 @body_format = 'HTML' ;

      SET @Counter = @Counter + 1
      END

Use following code to allign values in cell:
          ,"td/@align" = 'right', td =  TotalHours, ''
          ,"td/@align" = 'right', td =  TotalRevenue,''
          ,"td/@align" = 'right', td =  TotalCost,''
          ,"td/@align" = 'right', td =  GrossMargin,''


Use following code to format values in cell:

       ,"td/@align" = 'right', "td/@bgcolor" = CASE WHEN CurrMonth_IdleCost > PrevMonth_IdleCost
           THEN 'RED' END, td = CurrMonth_IdleCost, ''
         ,"td/@align" = 'right', td = PrevWeek_IdleHrs, ''
         ,"td/@align" = 'right', td = PrevWeek_IdleCost, ''
On executing the above stored procs a mail will be sent to the respective supervisors. The format will be as like below: