Related
i want to insert multiples rows, my first column (MATR) should be each number of the table #MATR
DECLARE #MATR TABLE (id INT)
INSERT INTO #MATR values (22),(23),(99),(101)
INSERT INTO [dbo].[GPI_DOS_ANC_EXP]
([MATR]
,[ANC_APQ_YEAR]
,[ANC_ACQ_ENS_NB_YEAR]
,[ANC_ACQ_ENS_NB_DAY])
VALUES (*Something here* ,NULL ,'0','0.00')
the database should look like this (22, null, 0, 0.00), (23, null, 0, 0.00), (99, null, 0, 0.00), (101, null, 0, 0.00)
I need some help please !
I think you want insert . . . select:
INSERT INTO [dbo].[GPI_DOS_ANC_EXP] ([MATR], [ANC_APQ_YEAR], [ANC_ACQ_ENS_NB_YEAR],[ANC_ACQ_ENS_NB_DAY])
SELECT m.id, NULL, 0, 0.00
FROM #MATR m;
I am trying to distribute the periodic total amounts to months which are represented on rows. Desired values are shown in column named MONTHLY_COLLECTION_DESIRED.
When a policy has a yearly payment frequency 12 (monthly) then there is nothing to revise. However, payment frequency can change in time and when it is different than 12 (monthly), I need to distribute the PERIODIC_COLLECTION amount to months (rows).
Note: It is possible that PERIODIC_COLLECTION amount can be less than PERIODIC_PREMIUM; when this is the case, remaining amount must be shown in the last row. For instance, when 3 months of PERIODIC_PREMIUM total value is 360 but PERIODIC_COLLECTION is 300, then out of related 3 rows, the value of first two must be 120 and the last one must be 60 which is 300-(120+120).
Thanks in advance!
Code for data:
DROP TABLE MYTABLE;
CREATE TABLE MYTABLE (POLICY_ID NUMBER(11), START_OF_MONTH DATE, PLANNED_PAYMENT_DATE DATE, PERIODIC_PREMIUM NUMBER(5), YEARLY_PAYMENT_FREQ NUMBER(2), MONTHLY_PREMIUM NUMBER(5), PERIODIC_COLLECTION NUMBER(5),MONTHLY_COLLECTION_DESIRED NUMBER(5));
INSERT INTO MYTABLE VALUES (1, DATE '2014-08-01', DATE '2014-08-01',120,12,120, 120, 120);
INSERT INTO MYTABLE VALUES (1, DATE '2014-09-01', DATE '2014-09-01',120,12,120, 120, 120);
INSERT INTO MYTABLE VALUES (1, DATE '2014-10-01', DATE '2014-10-01',120,12,120, 120, 120);
INSERT INTO MYTABLE VALUES (1, DATE '2014-11-01', DATE '2014-11-01',360,4,120, 360, 120);
INSERT INTO MYTABLE VALUES (1, DATE '2014-12-01', DATE '2014-11-01',0,4,120, 0, 120);
INSERT INTO MYTABLE VALUES (1, DATE '2015-01-01', DATE '2014-11-01',0,4,120, 0, 120);
INSERT INTO MYTABLE VALUES (1, DATE '2015-02-01', DATE '2015-02-01',360,4,120, 300, 120);
INSERT INTO MYTABLE VALUES (1, DATE '2015-03-01', DATE '2015-02-01',0,4,120, 0, 120);
INSERT INTO MYTABLE VALUES (1, DATE '2015-04-01', DATE '2015-02-01',0,4,120, 0, 60);
INSERT INTO MYTABLE VALUES (1, DATE '2015-05-01', DATE '2015-05-01',720,2,120, 600, 120);
INSERT INTO MYTABLE VALUES (1, DATE '2015-06-01', DATE '2015-05-01',0,2,120, 0, 120);
INSERT INTO MYTABLE VALUES (1, DATE '2015-07-01', DATE '2015-05-01',0,2,120, 0, 120);
INSERT INTO MYTABLE VALUES (1, DATE '2015-08-01', DATE '2015-05-01',0,2,120, 0, 120);
INSERT INTO MYTABLE VALUES (1, DATE '2015-09-01', DATE '2015-05-01',0,2,120, 0, 120);
INSERT INTO MYTABLE VALUES (1, DATE '2015-10-01', DATE '2015-05-01',0,2,120, 0, 0);
INSERT INTO MYTABLE VALUES (1, DATE '2015-11-01', DATE '2015-11-01',250,12,250, 250,250);
INSERT INTO MYTABLE VALUES (1, DATE '2015-12-01', DATE '2015-12-01',250,12,250, 250,250);
INSERT INTO MYTABLE VALUES (2, DATE '2017-01-01', DATE '2017-01-01',60,3,15,60, 15);
INSERT INTO MYTABLE VALUES (2, DATE '2017-02-01', DATE '2017-01-01',0,3,15,0, 15);
INSERT INTO MYTABLE VALUES (2, DATE '2017-03-01', DATE '2017-01-01',0,3,15,0, 15);
INSERT INTO MYTABLE VALUES (2, DATE '2017-04-01', DATE '2017-01-01',0,3,15,0,15);
INSERT INTO MYTABLE VALUES (2, DATE '2017-05-01', DATE '2017-05-01',60,3,15,40, 15);
INSERT INTO MYTABLE VALUES (2, DATE '2017-06-01', DATE '2017-05-01',0,3,15,0, 15);
INSERT INTO MYTABLE VALUES (2, DATE '2017-07-01', DATE '2017-05-01',0,3,15,0, 10);
INSERT INTO MYTABLE VALUES (2, DATE '2017-08-01', DATE '2017-05-01',0,3,15,0,0);
INSERT INTO MYTABLE VALUES (2, DATE '2017-09-01', DATE '2017-09-01',15,12,15,15, 15);
INSERT INTO MYTABLE VALUES (2, DATE '2017-10-01', DATE '2017-10-01',15,12,15,15, 15);
SELECT * FROM MYTABLE;
I have this table structure and I want a query that needs to be returning opposite side columns values.
CREATE TABLE TransactionDetail
(
ID NUMERIC NOT NULL PRIMARY KEY,
TransactionCode bigint,
COATitle NVARCHAR(50),
DrAmount NUMERIC,
CrAmount NUMERIC
);
INSERT INTO TransactionDetail VALUES (1, 1, 'Overtime', '2500', NULL);
INSERT INTO TransactionDetail VALUES (2, 1, 'Internship', NULL, '1500');
INSERT INTO TransactionDetail VALUES (3, 1, 'Medical', NULL, '1000');
INSERT INTO TransactionDetail VALUES (4, 2, 'Internship', '1150', NULL);
INSERT INTO TransactionDetail VALUES (5, 2, 'Overtime', NULL, '1150');
INSERT INTO TransactionDetail VALUES (6, 3, 'Overtime', '600', NULL);
INSERT INTO TransactionDetail VALUES (7, 3, 'Refreshment', '400', NULL);
INSERT INTO TransactionDetail VALUES (8, 3, 'Car Loan', '200', NULL);
INSERT INTO TransactionDetail VALUES (9, 3, 'Office Expenses', NULL, '1200');
If I pass parameter with value Overtime then it should return following rows
SELECT COATitle, DrAmount, CrAmount
FROM TransactionDetail
WHERE COATitle <> Overtime
Internship NULL 1500
Medical NULL 1000
Internship 1150 NULL
Office Expenses NULL 1200
The logic is against each transaction if the selected Account is on Debit side it should print the Credit side accounts and if the selected Account is on Credit side it should print Debit side accounts against that specific TransactionCode
The following code gives the desired result. It does that by checking to see whether the provided parameter is a debit or credit (or doesn't exist) in the current transaction, then only displays the reverse as specified.
declare #Parameter nvarchar(50) = 'Overtime'
declare #Trans TABLE
(
ID NUMERIC NOT NULL,
TransactionCode bigint,
COATitle NVARCHAR(50),
DrAmount NUMERIC,
CrAmount NUMERIC
);
INSERT INTO #Trans VALUES (1, 1, 'Overtime', '2500', NULL);
INSERT INTO #Trans VALUES (2, 1, 'Internship', NULL, '1500');
INSERT INTO #Trans VALUES (3, 1, 'Medical', NULL, '1000');
INSERT INTO #Trans VALUES (4, 2, 'Internship', '1150', NULL);
INSERT INTO #Trans VALUES (5, 2, 'Overtime', NULL, '1150');
INSERT INTO #Trans VALUES (6, 3, 'Overtime', '600', NULL);
INSERT INTO #Trans VALUES (7, 3, 'Refreshment', '400', NULL);
INSERT INTO #Trans VALUES (8, 3, 'Car Loan', '200', NULL);
INSERT INTO #Trans VALUES (9, 3, 'Office Expenses', NULL, '1200');
select TransactionCode, COATitle, DrAmount, CrAmount
from (
SELECT TransactionCode, COATitle, DrAmount, CrAmount
, case when exists (select 1 from #Trans T1 where T1.TransactionCode = T.TransactionCode and T1.COATitle = #Parameter and DrAmount is not null) then 1
when exists (select 1 from #Trans T1 where T1.TransactionCode = T.TransactionCode and T1.COATitle = #Parameter and CrAmount is not null) then -1
else 0 end TransSign
FROM #Trans T
WHERE COATitle <> #Parameter
) X
where (TransSign = -1 and DrAmount is not null)
or (TransSign = 1 and CrAmount is not null)
I have a simple view created in VS 2017. Here it is:
CREATE VIEW [dbo].[ApplicantStat]
AS SELECT ISNULL(CONVERT(VARCHAR(50), NEWID()), '') AS ID,
ISNULL(AVG(ApplicationTime), 0) AS 'AvgApplicationTime',
ISNULL(AVG(ResponseTime), 0) AS 'AvgResponseTime',
ISNULL(CAST(COUNT(CASE WHEN [IsAccepted] = 1 THEN 1 END) / COUNT(CASE WHEN [IsValid] = 1 THEN 1 END) AS float), 0) AS 'PctAccepted'
FROM [Application]
WHERE CreatedOn BETWEEN CAST(GETDATE()-30 AS date) AND CAST(GETDATE()-1 AS date)
As you can see, it gets data between 2 dates and does some simple aggregation.
The idea of the cast is that I want to ignore the time and get everything for the date range regardless - so as of today, 15th Mar, I would it to fetch everything for 14th March 00:00:00 - 23:59:59 and 29 days previous.
This does not happen - it picks up 3 rows (13th) - it should pick up all 5 rows. And yes, my system date is currently 15/03/2018 14:44 (UK time).
Here's, the table and data:
CREATE TABLE [dbo].[Application] (
[Id] INT NOT NULL,
[ApplicantId] INT NOT NULL,
[LoanAmount] INT NOT NULL,
[LoanTerm] SMALLINT NOT NULL,
[EmailAddress] VARCHAR (254) NOT NULL,
[MobilePhone] VARCHAR (11) NOT NULL,
[House] VARCHAR (25) NOT NULL,
[Street] VARCHAR (50) NOT NULL,
[TownCity] VARCHAR (50) NOT NULL,
[Postcode] VARCHAR (7) NOT NULL,
[IpAddress] VARCHAR (39) NOT NULL,
[IsValid] BIT NOT NULL,
[IsAccepted] BIT NOT NULL,
[Commission] DECIMAL (9, 2) NOT NULL,
[Processors] VARCHAR (500) NOT NULL,
[ResponseTime] SMALLINT NOT NULL,
[ApplicationTime] SMALLINT NOT NULL,
[CreatedOn] DATETIME NOT NULL,
PRIMARY KEY CLUSTERED ([Id] ASC)
);
INSERT INTO [dbo].[Application] ([Id], [ApplicantId], [LoanAmount], [LoanTerm], [EmailAddress], [MobilePhone], [House], [Street], [TownCity], [Postcode], [IpAddress], [IsValid], [IsAccepted], [Commission], [Processors], [ResponseTime], [ApplicationTime], [CreatedOn]) VALUES (1, 1, 300, 3, N'john.doe#tmail.com', N'07957000000', N'1', N'Acacia Avenue', N'Suburbia', N'SB1 2RB', N'100.100.100.100', 1, 1, CAST(3.20 AS Decimal(9, 2)), N'1,2,3,4,5', 90, 600, N'2018-03-13 08:00:00')
INSERT INTO [dbo].[Application] ([Id], [ApplicantId], [LoanAmount], [LoanTerm], [EmailAddress], [MobilePhone], [House], [Street], [TownCity], [Postcode], [IpAddress], [IsValid], [IsAccepted], [Commission], [Processors], [ResponseTime], [ApplicationTime], [CreatedOn]) VALUES (2, 2, 500, 12, N'a#b.com', N'0', N'1', N'a', N's', N's', N'1', 0, 1, CAST(5.00 AS Decimal(9, 2)), N'1', 60, 300, N'2018-03-14 16:00:00')
INSERT INTO [dbo].[Application] ([Id], [ApplicantId], [LoanAmount], [LoanTerm], [EmailAddress], [MobilePhone], [House], [Street], [TownCity], [Postcode], [IpAddress], [IsValid], [IsAccepted], [Commission], [Processors], [ResponseTime], [ApplicationTime], [CreatedOn]) VALUES (3, 3, 1000, 6, N'a#b.com', N'0', N'1', N'a', N's', N's', N'1', 1, 1, CAST(7.00 AS Decimal(9, 2)), N'1', 75, 360, N'2018-03-13 10:00:00')
INSERT INTO [dbo].[Application] ([Id], [ApplicantId], [LoanAmount], [LoanTerm], [EmailAddress], [MobilePhone], [House], [Street], [TownCity], [Postcode], [IpAddress], [IsValid], [IsAccepted], [Commission], [Processors], [ResponseTime], [ApplicationTime], [CreatedOn]) VALUES (4, 4, 2000, 24, N'a#b.com', N'0', N'1', N'a', N's', N's', N'1', 1, 1, CAST(20.00 AS Decimal(9, 2)), N'1', 30, 365, N'2018-03-14 11:00:00')
INSERT INTO [dbo].[Application] ([Id], [ApplicantId], [LoanAmount], [LoanTerm], [EmailAddress], [MobilePhone], [House], [Street], [TownCity], [Postcode], [IpAddress], [IsValid], [IsAccepted], [Commission], [Processors], [ResponseTime], [ApplicationTime], [CreatedOn]) VALUES (5, 5, 3000, 18, N'a#b.com', N'0', N'1', N'a', N's', N's', N'1', 1, 1, CAST(40.00 AS Decimal(9, 2)), N'1', 45, 330, N'2018-03-13 12:00:00')
Try this out:
WHERE
CreatedOn >= CAST(GETDATE()-30 AS date) AND
CreatedOn < CAST(GETDATE() AS date)
The problem is your converting to date the day before today.
You can CAST your CreatedOn field as DATE to remove the time portion, which is getting in your way here...
Perhaps
WHERE CAST(CreatedOn AS DATE) BETWEEN CAST(GETDATE()-30 AS date) AND CAST(GETDATE()-1 AS date)
BUT - CASTing a field in the WHERE expression may make it non SARGable. See here. So avoid this solution for large or production environments unless you know the expression will be SARGable. Use only as a test to refine your logic and options. (Even if there is no explicit index on CreatedOn - it may still suffer as SQL builds its own indexes all the time if no index exists explicitly.
Always worth confirming whether it is SARGable so you know for sure.)
To see what is happening - view your values in your SELECT - just to get an idea of what is working
For example:
SELECT TOP 1000
CreatedOn
,CAST(GETDATE()-30 AS date)
,CAST(GETDATE()-1 AS date)
FROM [Application]
Or see the other options for removing time values from datatime fields here
as you may want to coerce or round the time value instead
Instead of trying to ignore the time value, just make sure that your search terms are accurate for it. Also, don't blindly add things like ISNULL to every column. Spend a few seconds thinking if it's relevant or not. NEWID() for example, is never going to return a NULL value to you. Adding that kind of code is poor programming which will lead to less legible code.
Here's how I would write it to account for the time portions:
CREATE VIEW dbo.ApplicantStat
AS
SELECT
CONVERT(VARCHAR(50), NEWID()) AS ID,
COALESCE(AVG(ApplicationTime), 0) AS AvgApplicationTime,
COALESCE(AVG(ResponseTime), 0) AS AvgResponseTime,
COALESCE(CAST(COUNT(CASE WHEN [IsAccepted] = 1 THEN 1 END) / COUNT(CASE WHEN [IsValid] = 1 THEN 1 END) AS float), 0) AS PctAccepted
FROM
dbo.Application
WHERE
CreatedOn >= DATEADD(DAY, -30, CAST(GETDATE() AS DATE)) AND
CreatedOn < CAST(GETDATE() AS DATE)
Table Schema:
CREATE TABLE [dbo].[VMaster](
[VID] [int] IDENTITY(1,1) PRIMARY KEY NOT NULL,
[VName] [varchar](30) NOT NULL
)
GO
CREATE TABLE [dbo].[TblMaster](
[SID] [int] IDENTITY(1,1) NOT NULL Primary Key,
[VID] [int] NOT NULL,
[CreatedDate] [datetime] default (getdate()) NOT NULL,
[CharToAdd] [varchar](10) NOT NULL,
[Start] [int] NOT NULL,
[End] [int] NOT NULL
) ON [PRIMARY]
GO
CREATE TABLE [dbo].[TblDetails](
[DetailsID] [int] IDENTITY(1,1) NOT NULL Primary Key,
[SID] [int] NOT NULL,
[Sno] [int] NOT NULL,
[ConcatenatedText] [varchar](20) NOT NULL,
[isIssued] [bit] default (0) NOT NULL,
[isUsed] [bit] default (0) NOT NULL
)
GO
ALTER TABLE [dbo].[TblMaster] WITH CHECK ADD CONSTRAINT [fk_SI_id] FOREIGN KEY([VID])
REFERENCES [dbo].[VMaster] ([VID])
GO
ALTER TABLE [dbo].[TblMaster] CHECK CONSTRAINT [fk_SI_id]
GO
Sample data:
Insert into dbo.VMaster Values ('A1')
Insert into dbo.VMaster Values ('A2')
GO
Insert into dbo.TblMaster Values (1,default, 'ABC', 1, 5)
Insert into dbo.TblMaster Values (1,default, 'XYZ', 10, 20)
Insert into dbo.TblMaster Values (2,default, 'P1', 10, 15)
GO
Insert into dbo.TblDetails values(1, 1, 'ABC1', 1,0)
Insert into dbo.TblDetails values(1, 2, 'ABC2', 1,0)
Insert into dbo.TblDetails values(1, 3, 'ABC3', 1,0)
Insert into dbo.TblDetails values(1, 4, 'ABC4', 0,0)
Insert into dbo.TblDetails values(1, 5, 'ABC5', 0,0)
Insert into dbo.TblDetails values(2, 10, 'XYZ10', 1,0)
Insert into dbo.TblDetails values(2, 11, 'XYZ11', 1,0)
Insert into dbo.TblDetails values(2, 12, 'XYZ12', 1,0)
Insert into dbo.TblDetails values(2, 13, 'XYZ13', 1,0)
Insert into dbo.TblDetails values(2, 14, 'XYZ14', 1,0)
Insert into dbo.TblDetails values(2, 15, 'XYZ15', 0,0)
Insert into dbo.TblDetails values(2, 16, 'XYZ16', 0,0)
Insert into dbo.TblDetails values(2, 17, 'XYZ17', 0,0)
Insert into dbo.TblDetails values(2, 18, 'XYZ18', 0,0)
Insert into dbo.TblDetails values(2, 19, 'XYZ19', 0,0)
Insert into dbo.TblDetails values(2, 20, 'XYZ20', 0,0)
Insert into dbo.TblDetails values(3, 10, 'P110', 1,0)
Insert into dbo.TblDetails values(3, 11, 'P111', 1,0)
Insert into dbo.TblDetails values(3, 12, 'P112', 1,0)
Insert into dbo.TblDetails values(3, 13, 'P113', 1,0)
Insert into dbo.TblDetails values(3, 14, 'P114', 1,0)
Insert into dbo.TblDetails values(3, 15, 'P115', 1,0)
GO
Expected Output:
Query which I have as of now:
SELECT
TM.VID, VM.VName, TM.CharToAdd, TM.Start, TM.[End],
(SELECT COUNT(*) FROM dbo.TblDetails TD where TD.SID=TM.SID and isIssued = 0 ) Balance
FROM
dbo.TblMaster TM, dbo.VMaster VM
Where VM.VID = TM.VID
I am trying to calculate total matching records in TblDetails for each VID whose isIssued value is 0.
User could select a period (date range) for which they want to see this output. For that TblMaster.CreatedDate is what we have to use.
Also user can select a specific VID and like to see the result only for that.
Just in case if date range or VID is not provided then this has to work against the whole table! Per month there might be 500000 records in TblDetails and we will hold 12 months of data.
For the summary of the whole table your query looks OK.
It is easy to add an optional filtering on top of that.
If parameter is NULL, it will be ignored. If parameter is not NULL, it will limit the result set:
DECLARE #ParamStart datetime = '2016-01-01';
DECLARE #ParamEnd datetime = '2017-01-01';
DECLARE #ParamVID int = NULL;
SELECT
TM.VID, VM.VName, TM.CharToAdd, TM.Start, TM.[End],
(SELECT COUNT(*) FROM dbo.TblDetails TD where TD.SID=TM.SID and isIssued = 0) Balance
FROM
dbo.TblMaster AS TM
INNER JOIN dbo.VMaster AS VM ON VM.VID = TM.VID
WHERE
(TM.CreatedDate >= #ParamStart OR #ParamStart IS NULL)
AND (TM.CreatedDate < #ParamEnd OR #ParamEnd IS NULL)
AND (TM.VID = #ParamVID OR #ParamVID IS NULL)
ORDER BY TM.SID
OPTION(RECOMPILE);
To make it efficient, it should help to have this index:
CREATE NONCLUSTERED INDEX [IX_] ON [dbo].[TblDetails]
(
[isIssued] ASC,
[SID] ASC
)
And also indexes on dbo.TblMaster.CreatedDate and dbo.TblMaster.VID.