Trying to round the results of a sql query to 2 decimals - sql

In the following query, I'm trying to return the data with 2 decimal places (.00) for the SUM line:
SELECT
CONVERT(varchar, YEAR(COALESCE(release_date, requested_date)))
+ RIGHT('00' + CONVERT(varchar, MONTH(COALESCE(release_date, requested_date))), 2) AS yrmnth,
salesrep,
customer_name,
SUM(price_per_ea * COALESCE(open_release_qty, open_order_qty)) AS ext_price

you could use convert for take control over the format
SELECT
CONVERT(VARCHAR, YEAR(COALESCE(release_date, requested_date)))
+ RIGHT('00' + CONVERT(VARCHAR,
MONTH(COALESCE(release_date, requested_date))),2) as yrmnth
,salesrep
,customer_name
, Convert(decimal(12,2),
SUM(price_per_ea * COALESCE(open_release_qty, open_order_qty))) as ext_price

Use the round function in your select:
round(SUM(price_per_ea * COALESCE(open_release_qty, open_order_qty)),2)

Related

Two dates having same values failing when joined in SQL Server 2014 using CONVERT and DATEPART functions

I am facing a very weird problem in joining on two dates in SQL Server 2014. I have a condition like below in my where clause :-
SELECT
a.*, w.*
FROM
TABLE1 a, TABLE2 w
WHERE
CONVERT(varchar(8), ISNULL(a.Col1,999), 112) + ' ' + CONVERT(VARCHAR, DATEPART(hh, ISNULL(a.Col1,999))) + ':' + RIGHT('0' + CONVERT(VARCHAR, DATEPART(mi, ISNULL(a.Col1,999))), 2)
= CONVERT(varchar(8),ISNULL(w.Col2,999),112) + ' ' + CONVERT(VARCHAR, DATEPART(hh, ISNULL(w.Col2,999))) + ':' + RIGHT('0' + CONVERT(VARCHAR, DATEPART(mi, ISNULL(w.Col2,999))), 2)
Here Col1 in Table1 and Col2 in Table2 are of type VARCHAR(18).
When selected separately both using the CONVERT and DATEPART function, both return the same value but when used in a join condition it fails with below error:
ERROR encountered - 241Conversion failed when converting date and/or time from character string
Example of Col1 in Table1 data:- "20190227 17:20:40"
Any help is truly appreciated!!

Join two tables to generate a graph, but they don't have common columns

I'm trying to build a SQL consult that populates a data table that will give the info that will draw a js graph (on canvasjs library).
The graph will compare the sales table vs. the expenses table, so they don't have a column on wich I can make a JOIN, only the dates, that will be shown as yyyy-mm.
In order to group all the sales, I need to Join two tables, the one that stores the main invoices info ([dbo].[Facturas]), and the one that stores the items on each invoice ([dbo].[FacturasItems])
This is the consult that retrieves the info for all the sales, and groups them in months:
DECLARE #facTotal numeric(18,2)
SET #facTotal =
(
SELECT
SUM(([dbo].[FacturasItems].[ValorU] * [dbo].[FacturasItems].[Cantidad]) + (([dbo].[FacturasItems].[ValorU] * [dbo].[FacturasItems].[Cantidad]) * [dbo].[Facturas].[ValorIVA]))
FROM [dbo].[FacturasItems]
INNER JOIN
[dbo].[Facturas]
ON [dbo].[Facturas].[ID] = [dbo].[FacturasItems].[IdFactura]
)
SELECT
CAST(YEAR([dbo].[Facturas].[FechaCr]) AS VARCHAR(4)) + '-' + right('00' + CAST(MONTH([dbo].[Facturas].[FechaCr]) AS VARCHAR(2)), 2) AS [Periodo],
CONVERT(numeric(18,0), SUM(([dbo].[FacturasItems].[ValorU] * [dbo].[FacturasItems].[Cantidad]) + (([dbo].[FacturasItems].[ValorU] * [dbo].[FacturasItems].[Cantidad]) * [dbo].[Facturas].[ValorIVA]))) AS [VentasRaw],
'$' + CONVERT(varchar, CONVERT(money, SUM(([dbo].[FacturasItems].[ValorU] * [dbo].[FacturasItems].[Cantidad]) + (([dbo].[FacturasItems].[ValorU] * [dbo].[FacturasItems].[Cantidad]) * [dbo].[Facturas].[ValorIVA]))), 1) AS [VentasForm],
CONVERT(varchar(6), CONVERT(numeric(18,2), SUM(([dbo].[FacturasItems].[ValorU] * [dbo].[FacturasItems].[Cantidad]) + (([dbo].[FacturasItems].[ValorU] * [dbo].[FacturasItems].[Cantidad]) * [dbo].[Facturas].[ValorIVA])) / (#facTotal) * 100)) + '%' AS [Prc100]
FROM [dbo].[Facturas]
INNER JOIN
[dbo].[FacturasItems]
ON [dbo].[FacturasItems].[IdFactura] = [dbo].[Facturas].[ID]
GROUP BY
CAST(YEAR([dbo].[Facturas].[FechaCr]) AS VARCHAR(4)) + '-' + right('00' + CAST(MONTH([dbo].[Facturas].[FechaCr]) AS VARCHAR(2)), 2)
This consult is working just fine, and it returns this table data:
The second consult, expenses, goes like this:
DECLARE #gasTotal numeric(18,2)
SET #gasTotal =
(
SELECT
SUM(([dbo].[Gastos].[Valor]) + (([dbo].[Gastos].[Valor]) * [dbo].[Gastos].[IVAVal]))
FROM [dbo].[Gastos]
)
SELECT
CAST(YEAR([dbo].[Gastos].[Fecha]) AS varchar(4)) + '-' + RIGHT('00' + CAST(MONTH([dbo].[Gastos].[Fecha]) AS varchar(2)), 2) AS [Periodo],
CONVERT(numeric(18,0), SUM([dbo].[Gastos].[Valor] + ([dbo].[Gastos].[Valor] * [dbo].[Gastos].[IVAVal]))) AS [ValorGraph],
'$' + CONVERT(varchar, CONVERT(money, SUM([dbo].[Gastos].[Valor] + ([dbo].[Gastos].[Valor] * [dbo].[Gastos].[IVAVal]))), 1) AS [ValorForm],
CONVERT(varchar, CONVERT(money, SUM(([dbo].[Gastos].[Valor] + ([dbo].[Gastos].[Valor] * [dbo].[Gastos].[IVAVal])) / #gasTotal) * 100), 1) + '%' AS [Prc100]
FROM [dbo].[Gastos]
GROUP BY
CAST(YEAR([dbo].[Gastos].[Fecha]) AS varchar(4)) + '-' + RIGHT('00' + CAST(MONTH([dbo].[Gastos].[Fecha]) AS varchar(2)), 2)
This will create this table:
So, as you can see, there where no sales on 2017-10, zero invoices, so the table 1 won't start on 2017-10 but on 2017-11, while the expenses table starts on 2017-10.
I need that the table 1 (invoices and sales), starts in 2017-10 with it's values in 0, so that the graph will show correcty.
In other words, I need this kind of tables:
I tryed an inner join, a left join and an outer join, but the will add all the records, add the sales + expenses.
Thanks!
Just add
SELECT 2017-10 as Periodo,0 as VentasRow, 0 as VentasForm, 0 as Prc100
UNION
Your first query here....
Hope this helps.
WITH Ventas as (
SELECT
CAST(YEAR(f.FechaCr) AS VARCHAR(4)) + '-'
+ right('00' + CAST(MONTH(f.FechaCr) AS VARCHAR(2)), 2) AS Periodo,
SUM(fi.ValorU * fi.Cantidad * (1 + f.ValorIVA)) AS VentasRaw,
SUM(fi.ValorU * fi.Cantidad * (1 + f.ValorIVA)) OVER () AS VentasTot
FROM dbo.Facturas as f INNER JOIN dbo.FacturasItems as fi
ON fi.IdFactura = f.ID
GROUP BY datepart(year, f.FechaCr), datepart(month, f.FechaCr)
),
Gastos as (
SELECT
CAST(YEAR(g.Fecha) AS varchar(4)) + '-'
+ RIGHT('00' + CAST(MONTH(g.Fecha) AS varchar(2)), 2) AS Periodo,
SUM(g.Valor * (1 * g.IVAVal) AS ValorGraph,
SUM(g.Valor * (1 * g.IVAVal) OVER () AS GastosTot
FROM dbo.Gastos as g
GROUP BY datepart(year, g.Fecha), datepart(month, g.Fecha)
)
SELECT g.Periodo,
COALESCE(v.VentasRaw, 0), COALESCE(v.VentasTot, 0),
g.ValorGraph, g.GastosTot
FROM Ventas as v RIGHT OUTER JOIN Gastos g ON g.Periodo = v.Periodo;
You could certainly use a full outer join if it's possible to have sales but no expenses.

Convert hours into days:Hours format in SQL Server

Create Table
(
id int identity(1,1),
WorkHours int
)
This is my table which stores working hours as integer. My requirement is to display work hours in DD:HH format. How is it possible?
To get it DD:HH format, you'll need to do some math as well as some 00 padding (or you get D:H) format:
select RIGHT('00' + CONVERT(VARCHAR, WorkHours / 24), 2) + ':' + RIGHT('00' + CONVERT(VARCHAR, WorkHours% 24), 2)
from MyTable
Integer division in SQL-Server is int1 / int2.
Modulo in SQL-Server is int1 % int2.
The function for formatting numbers in SQL-Server is FORMAT.
The string concatenation operator in SQL-Server is the non-standard +.
The query:
select format(workhours / 24, '00') + ':' + format(workhours % 24, '00')
from mytable;
with Calcs as
(
select id, floor(WorkHours/24) as DDField, (WorkHours/24)-floor(WorkHours/24) as HHField
from MyTable
)
select id, DDField + ':' + HHField
from Calcs

Sum time in SQL Stored procedure

How sum time in SQL my procedure return:
START -- FINISH --- TOTAL
18:14:47 20:32:54 02:18:06
12:35:45 15:06:06 02:30:21
18:08:26 21:25:39 03:17:12
I need sum column TOTAL (08:05:40)
My stored procedure:
Alter PROCEDURE [dbo].[timeTotal]
#userName nvarchar(50)
AS
BEGIN
SELECT
CONVERT(VARCHAR(8),dateadd(HH,7,workStart),108) AS workStart,
CONVERT(VARCHAR(8),dateadd(HH,7,workFinish),108) AS workFinish,
CONVERT(VARCHAR(8),workFinish - workStart,108) AS total
FROM workTime
WHERE userName = userName
END
I need get 08:05:40
To sum time difference in hours, use the following:
SELECT
(RIGHT('00' + CONVERT(VARCHAR(10), SUM(DATEDIFF(MINUTE, FromTime, ToTime)) / 60), 2)
+ ':' +
RIGHT('00' + CONVERT(VARCHAR(2), SUM(DATEDIFF(Minute, FromTime, ToTime)) % 60), 2)
+ ':' +
RIGHT('00' + CONVERT(VARCHAR(2), SUM(DATEDIFF(SECOND, FromTime, ToTime)) % 60), 2))
AS TotalTime FROM AllocateRoom
Use the above in the stored procedure and it returns sum of time difference as follows:
01:20:20
Finally your expected data as follows:
;WITH DEMO(ID, FromTime, ToTime) AS
(
SELECT TOP 1
ID
,CONVERT(DATETIME,FromTime,120) AS FromTime
,CONVERT(DATETIME,ToTime,120) AS ToTime
FROM (VALUES (1,'2016-09-03 18:14:47.000','2016-09-03 20:32:54.000')
,(2,'2016-09-03 12:35:45.000','2016-09-03 15:06:06.000')
) AS X(ID,FromTime,ToTime)
)
SELECT
k.ID,
k.FromTime,
k.ToTime,
DATEADD(SECOND,DATEDIFF(SECOND, k.FromTime, k.ToTime),CONVERT(TIME(0),'00:00:00',0)) AS TIME_DIFF,
DATEADD(SECOND,SUM(DATEDIFF(SECOND, k.FromTime, k.ToTime)) OVER
(
PARTITION BY (SELECT NULL)
),CONVERT(TIME(0),'00:00:00',0)) AS TIME_SUM
FROM DEMO k;
use DATEDIFF() instead of subtraction to find the time different between 2 dates
DATEDIFF(SECOND, workStart, workFinish) AS total
to display it in HH:MM:SS,
CONVERT(VARCHAR(8), DATEADD(SECOND, 0, DATEDIFF(SECOND, workStart, workFinish)),108) AS total

SQL server 2008 date conversion formats

I produce a CSV file but cannot figure out the proper date format.
I am aware of the MSDN site codes for datetime conversions:
http://msdn.microsoft.com/en-us/library/ms187928.aspx
It seems there is no code to convert my datetime into this format:
MM/DD/YYYY HH:MMAM
e.g.:
12/28/2014 4:33AM
How do you achieve such format?
Platform:
Microsoft SQL server 2008
SELECT CONVERT(VARCHAR(10), GETDATE(), 101) +
RIGHT(CONVERT(VARCHAR, GETDATE(), 100), 7)
This is what you can use and is probably the most straightforward:
SELECT
RIGHT('0' + cast(month(dateColumn) AS NVARCHAR(2)), 2) + '/' -- generate the day
+ RIGHT('0' + cast(day(dateColumn) AS NVARCHAR(2)), 2) + '/' -- generate the month
+ cast(year(dateColumn) AS NVARCHAR(4)) + ' ' -- generate the year
+ convert(VARCHAR, cast(dateColumn AS TIME)), 100) -- generate the time
FROM TABLE
SELECT CONVERT(VARCHAR, GetDate(), 101) + ' ' +
CONVERT(VARCHAR, DATEPART(hh, GetDate())) + ':' +
RIGHT('0' + CONVERT(VARCHAR, DATEPART(mi, GetDate())), 2) AS TIME
EDIT: This gets the AM/PM also
SELECT CONVERT(CHAR(11),GETDATE(),101)
+ CONVERT(CHAR( 5),GETDATE(),114)
+ RIGHT(CONVERT(CHAR( 5),GETDATE(),109), 2)
SELECT CONVERT(VARCHAR(10),GETDATE(),3) as 'dd/MM/yy'
SELECT CONVERT(VARCHAR(10),GETDATE(),103) as 'dd/MM/yyyy'
SELECT CONVERT(VARCHAR(10),GETDATE(),4) as 'dd.MM.yy'
SELECT CONVERT(VARCHAR(10),GETDATE(),104) as 'dd.MM.yyyy'
SELECT CONVERT(VARCHAR(10),GETDATE(),5) as 'dd-MM-yy'
SELECT CONVERT(VARCHAR(10),GETDATE(),105) as 'dd-MM-yyyy'
SELECT CONVERT(VARCHAR(10),GETDATE(),6) as 'ddMonthyy'
SELECT CONVERT(VARCHAR(10),GETDATE(),106) as 'ddMonthyyyy'
SELECT CONVERT(VARCHAR(10),GETDATE(),7) as 'Monthdd.yy'
SELECT CONVERT(VARCHAR(10),GETDATE(),107) as 'Monthdd.yyyy'
SELECT CONVERT(VARCHAR(10),GETDATE(),8) as 'hh.mm.ss'
SELECT CONVERT(VARCHAR(10),GETDATE(),108) as 'hh.mm.ss'
SELECT CONVERT(VARCHAR(100),GETDATE(),9) as 'Monthddyy hh.mm.ss.mss'
SELECT CONVERT(VARCHAR(100),GETDATE(),109) as 'Monthddyyyy hh.mm.ss.mss'
SELECT CONVERT(VARCHAR(100),GETDATE(),10) as 'mm-dd-yy'
SELECT CONVERT(VARCHAR(100),GETDATE(),110) as 'mm-dd-yyyy'
SELECT CONVERT(VARCHAR(100),GETDATE(),11) as 'yy/MM/dd'
SELECT CONVERT(VARCHAR(100),GETDATE(),111) as 'yyyy/MM/dd'
SELECT CONVERT(VARCHAR(100),GETDATE(),12) as 'yyMMdd'
SELECT CONVERT(VARCHAR(100),GETDATE(),112) as 'yyyyMMdd'
SELECT CONVERT(VARCHAR(100),GETDATE(),13) as 'ddMonthyy hh.mm.ss.mss'
SELECT CONVERT(VARCHAR(100),GETDATE(),113) as 'ddMonthyyyy hh.mm.ss.mss'