I have created this procedure but this is throwing error.
CREATE PROCEDURE GetSurrenderPolicyDetails
#policy_Id int,
#name nvarchar(50) output,
#policy_Amount Decimal(10,2) output,
#premiumPaidTillDate Decimal(10,2) output
AS
BEGIN
SET NOCOUNT ON;
SELECT
#name = Policy_Details.Name,
#policy_Amount = Insurance_Policy_Details.Policy_Amount,
#premiumPaidTillDate = SUM(Payment_Premium_Details.Premium_Amount)
FROM
Policy_Details
INNER JOIN
Payment_Premium_Details ON (Policy_Details.Policy_Id = Payment_Premium_Details.Policy_Id)
INNER JOIN
Insurance_Policy_Details ON (Policy_Details.Ins_Id = Insurance_Policy_Details.Ins_Id)
WHERE
Policy_Details.Policy_Id = #policy_Id;
END
GO
The error says
Column 'Policy_Details.Name' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
Well, the error is pretty clear: you have a SUM() aggregate in your SELECT, so therefore, you need to use GROUP BY for the other columns in your SELECT statement:
SELECT
#name = Policy_Details.Name,
#policy_Amount = Insurance_Policy_Details.Policy_Amount,
#premiumPaidTillDate = SUM(Payment_Premium_Details.Premium_Amount)
FROM
Policy_Details
INNER JOIN
Payment_Premium_Details ON (Policy_Details.Policy_Id = Payment_Premium_Details.Policy_Id)
INNER JOIN
Insurance_Policy_Details ON (Policy_Details.Ins_Id = Insurance_Policy_Details.Ins_Id)
WHERE
Policy_Details.Policy_Id = #policy_Id;
GROUP BY
Policy_Details.Name,
Insurance_Policy_Details.Policy_Amount,
your problem isn't your output parameters, but your join clauses; Instead, try something like:
INNER JOIN Insurance_Policy_Details
ON Policy_Details.Ins_Id = Insurance_Policy_Amount.Ins_Id
INNER JOIN Payment_Premium_Details
ON Policy_Details.Policy_Id = Payment_Premium_Details.Policy_Id
Related
I have a fairly complex Stored Procedure that is joining several tables together, but I need yet another column called in from a table that is yet to be joined.
Here's the Stored Procedure as it stands:
CREATE PROCEDURE [rpt].[PlannerShipToLocations_ds1]
AS
BEGIN
SET NOCOUNT ON;
DECLARE #sql nvarchar(4000)
,#DateStart nvarchar(10) = '2015-01-01'
DECLARE #t TABLE (
[PCN] int
,[Part_Key] int
,[Customer_Address_No] int
PRIMARY KEY CLUSTERED (
[Part_Key]
,[Customer_Address_No]
,[PCN]
)
)
SET #sql =
'SELECT *
FROM OPENQUERY (PLEXRPTSVR,
''SELECT DISTINCT
s.[PCN]
,sl.[Part_Key]
,s.[Customer_Address_No]
FROM [Sales_v_Shipper_e] AS s
INNER JOIN [Sales_v_Shipper_Status_e] AS ss
ON s.[PCN] = ss.[PCN]
AND s.[Shipper_Status_Key] = ss.[Shipper_Status_Key]
INNER JOIN [Sales_v_Shipper_Line_e] AS sl
ON s.[PCN] = sl.[PCN]
AND s.[Shipper_Key] = sl.[Shipper_Key]
WHERE 1 = 1
AND ss.[Shipped] = 1
AND s.[Ship_Date] >= ''''' + #DateStart + '''''
;'')'
INSERT INTO #t
EXECUTE sp_executesql #sql
;WITH base AS (
SELECT DISTINCT u.[Last_Name] + ', ' + u.[First_Name] AS [Planner]
,c.[Customer_Code] AS [Customer Code]
,c.[Name] AS [Customer Name]
,a.[Customer_Address_Code] AS [Customer Address Code]
**/* xxx.[Country] AS [Country] */**
FROM [plx].[Part_v_Customer_Part_e] cp
INNER JOIN [plx].[Part_v_Part_e] p
ON cp.[Plexus_Customer_No] = p.[Plexus_Customer_No]
AND cp.[Part_Key] = p.[Part_Key]
INNER JOIN [plx].[Common_v_Customer_e] c
ON cp.[Plexus_Customer_No] = c.[Plexus_Customer_No]
AND cp.[Customer_No] = c.[Customer_No]
INNER JOIN [plx].[Plexus_Control_v_Plexus_User_e] u
ON p.[Plexus_Customer_No] = u.[Plexus_Customer_No]
AND p.[Planner] = u.[Plexus_User_No]
OUTER APPLY (
SELECT [Customer_Address_Code], **/*[Country]*/**
FROM [plx].[Common_v_Customer_Address_e] a
INNER JOIN #t t
ON a.[Plexus_Customer_No] = t.[PCN]
AND a.[Customer_Address_No] = t.[Customer_Address_No]
**/* INNER JOIN [plx].[Common_v_Country] xxx
ON a.[Country_Key] = xxx.[Country_Key] */**
WHERE a.[Plexus_Customer_No] = p.[Plexus_Customer_No]
AND a.[Customer_No] = c.[Customer_No]
AND t.[Part_Key] = p.[Part_Key]
AND a.[Ship_To] = 1
) a
**
/* INNER JOIN [plx].[Common_v_Country] xxx
ON a.[Country_Key] = xxx.[Country_Key] */
/*
OUTER APPLY (
SELECT [Country]
FROM [plx].[Common_v_Country] xxx
INNER JOIN #t t
ON a.[Country_Key] = xxx.[Country_Key]
WHERE a.[Plexus_Customer_No] = p.[Plexus_Customer_No]
AND a.[Customer_No] = c.[Customer_No]
AND t.[Part_Key] = p.[Part_Key]
AND a.[Ship_To] = 1
) xxx
*/**
WHERE 1 = 1
AND u.[Lockout] = 0
AND p.[Part_Status] IN ('Production', 'Production - Near EOP', 'Pre-Production')
AND cp.[Active] = 1
)
SELECT t1.[Planner]
,t1.[Customer Code]
,t1.[Customer Name]
,STUFF(
(SELECT
' | ' + t2.[Customer Address Code]
FROM base t2
WHERE t1.[Planner] = t2.[Planner]
and t1.[Customer Code] = t2.[Customer Code]
ORDER BY t2.[Customer Address Code]
FOR XML PATH(''), TYPE
).value('.','varchar(max)')
,1,3,'') AS [Customer Address Code(s)]
FROM base t1
GROUP BY t1.[Planner]
,t1.[Customer Code]
,t1.[Customer Name]
ORDER BY [Customer Code]
,[Planner]
,[Customer Address Code(s)]
END
GO
I've bolded the sections that are my best guesses about how to go about joining this additional table, I recognize that I wouldn't use all of them but I wanted to show my thoughts. To break it down:
1.) [plx].[Common_v_Customer_Address_e] a AND [plx].[Common_v_Country] xxx are the two tables I need in order to call [Country] out by name. I essentially need to add this as a column displayed on the report and eventually will need to sort on it as well (I'll probably add it to ORDER BY at the end).
2.) I'm not sure if I need to be joining [plx].[Common_v_Country] xxx within the OUTER APPLY or if it needs its own separate INNER JOIN or what. I've illustrated and commented out both here. So far everything I've tried results in "The multi-part identifier 'xxx.Country' could not be bound."
Thanks for the help.
I've tried modifying the OUTER APPLY to include the new table. I've tried creating my own new INNER JOIN. I've tried creating my own new OUTER APPLY.
SELECT A.ioTDeviceKind, B.resourceRiskLevelLowCount, B.resourceRiskLevelMiddleCount, B.resourceRiskLevelHighCount FROM ioTDevice AS A JOIN resourcelogCurrent AS B ON A.ioTDeviceKind = B.ioTDeviceKind WHERE A.resourceId = 'airconditinal'
or
SELECT A.ioTDeviceKind, B.resourceRiskLevelLowCount, B.resourceRiskLevelMiddleCount, B.resourceRiskLevelHighCount FROM ioTDevice AS A INNER JOIN resourcelogCurrent AS B ON A.ioTDeviceKind = B.ioTDeviceKind WHERE A.resourceId = 'airconditinal'
but the result is null.
there is no error, but the result always is null,
where i user left join, there is no error..
please help me , how can i use inner join in solr??
I have the following stored-procedure in SQL server.
My code is the following:
CREATE PROCEDURE [dbo].[current_call]
-- Add the parameters for the stored procedure here
#user_id nvarchar(128)
AS
BEGIN
SET FMTONLY OFF
-- SET NOCOUNT ON added to prevent extra result sets from
-- interfering with SELECT statements.
SET NOCOUNT ON;
DECLARE #LocUserId nvarchar(128)
SET #LocUserId = #user_id
-- Insert statements for procedure here
SELECT dbo.Call.call_id, dbo.Call.amb_id as ambulanceNum, dbo.Call.patient_number as patientId, dbo.Call.patient_age, dbo.Call.patient_sex as gender, dbo.Call.patient_phone, dbo.Call.caller_name, dbo.Call.call_received, dbo.Call.call_transfer, dbo.Call.call_response, dbo.Priority.name AS priorityName, dbo.Call_Status.name as Call_Status,
dbo.Station.station_name, dbo.City.city_name, dbo.Protocol.name AS protocolName
FROM dbo.City INNER JOIN
dbo.Call INNER JOIN
dbo.Priority ON dbo.Call.priority = dbo.Priority.priority_id ON dbo.City.city_id = dbo.Call.city INNER JOIN
dbo.Protocol ON dbo.Call.protocol_category = dbo.Protocol.id LEFT OUTER JOIN
dbo.Station INNER JOIN
dbo.Ambulance ON dbo.Station.station_id = dbo.Ambulance.ambulance_station ON dbo.Call.amb_id = dbo.Ambulance.ambulance_id
INNER JOIN
dbo.Call_Status ON dbo.Call.call_status = dbo.Call_Status.call_status_id
WHERE dbo.Call.user_id=#LocUserId and dbo.Call.call_status=2
SET FMTONLY ON
END
This is the query plan.
Is there a way to make it to respond faster?
I am working on sql server I have two tables and I need to return records from the left table which are not found in the right table for that I am using left join like below query,
select #MID=MID,#MName=Name,#PID=PID,#PName=PName,#DID=DID from #CompanyDataInfo where id=#MCount
insert into #temp SELECT Top(1) f.Name,f.PID,f.PName,v.* FROM #CompanyDataInfo f
left join Employee v on v.Id=f.ID and v.DID=f.DID
where v.Id =#MID and v.DId = #DId and v.PId = #PId and v.CId =#CId and DATE_TIME between DATEADD(minute,-555,GETDATE()) and GETDATE() order by DATE_TIME desc
Result should be all rows from #CompanyDataInfo table while no record found in Employee table for related ID, I googled and use "v.Id is null" but not getting expected result
Is there any solution greatly appriciable
Thanks In advance
Your query is not using left join in correct way. You are using your right table reference in where clause. I try to correct it below but I don't have full information about your table schema. Please try this-
select
#MID = MID,
#MName = Name,
#PID = PID,
#PName = PName,
#DID = DID
from #CompanyDataInfo
where id = #MCount
insert into #temp
select
f.Name,
f.PID,
f.PName,
v.*
from #CompanyDataInfo f
left join Employee v on v.Id=f.ID and v.DID=f.DID
where f.Id = #MID and
f.DId = #DId and
f.PId = #PId and
f.CId = #CId and
f.DATE_TIME between DATEADD(minute,-555,GETDATE()) and GETDATE() and
v.Id is null
order by f.DATE_TIME desc
Add ...and v.Id is null to your where clause.
Hy everbody , i am having some trouble in transforming a query that has a set of subqueries in the ON clause.
The initial code was created in SQL Server and i have changed to work on Vertica.
This is the code :
SELECT
DISTINCT DocFinanceiro.AutoId AS AutoId,
DocFinanceiro.Classe AS ClasseDoc,
EspecPrestador.Seq AS Sequencia,
PrestadorServico.Codigo AS CodigoPrest,
PessoaPrest.Nome AS NomePrestador,
DocFinanceiro.CompFinanceira AS CompFinanceira,
EspecialidadeServico.Nome AS Especialidade,
ClassePrestador.Nome AS ClsPrestador,
RegistroPessoa.Numero AS RegistroINSS,
RegistroPessoa.Tipo AS TipoRegPessoa,
DocFinanceiro.DataVencimento AS DataVencimentoDocFin
FROM DocFinanceiro
INNER JOIN ClasseDocFinanceiro
ON DocFinanceiro.Classe = ClasseDocFinanceiro.Codigo
INNER JOIN ItemFinanceiro ON DocFinanceiro.AutoId = ItemFinanceiro.Documento
INNER JOIN ClasseApropriacaoFinan
ON ItemFinanceiro.ClasseApro = ClasseApropriacaoFinan.Codigo
INNER JOIN ContratoFinanceiro
ON DocFinanceiro.ContratoFinanceiro = ContratoFinanceiro.AutoId
INNER JOIN Pessoa ON ContratoFinanceiro.Pessoa = Pessoa.AutoId
INNER JOIN GeradorItemFinan
ON ItemFinanceiro.AutoId = GeradorItemFinan.ItemFinan
INNER JOIN PrestadorServico
ON ContratoFinanceiro.AutoId = PrestadorServico.ContratoFinanceiro
INNER JOIN Pessoa PessoaPrest ON PrestadorServico.Pessoa = PessoaPrest.AutoId
INNER JOIN TipoValorFinan
ON ClasseApropriacaoFinan.TipoValor = TipoValorFinan.Codigo
INNER JOIN ClasseContratoFinanceiro
ON ContratoFinanceiro.Classe = ClasseContratoFinanceiro.AutoId
INNER JOIN ClassePrestador
ON PrestadorServico.Classe = ClassePrestador.Codigo
LEFT JOIN EspecPrestador
ON EspecPrestador.Prestador = PrestadorServico.AutoId
AND EspecPrestador.Seq = 1
LEFT JOIN EspecialidadeServico
ON EspecialidadeServico.AutoId = EspecPrestador.Especialidade
LEFT JOIN RegistroPessoa ON PessoaPrest.AutoId = RegistroPessoa.Pessoa
--This is the part where i getr stuck
AND
(
RegistroPessoa.AutoId =
(
SELECT
RegistroPessoa.AutoId
FROM RegistroPessoa
WHERE RegistroPessoa.Pessoa = PessoaPrest.Autoid
AND (RegistroPessoa.Tipo = 1 OR RegistroPessoa.Tipo = 1) order by 1 limit 1
)
)
--until here
WHERE (GeradorItemFinan.TipoGerador = 1)
AND (DocFinanceiro.CompFinanceira = 1)
AND (PrestadorServico.AutoId = 1)
AND DocFinanceiro.CompSeq = 1
AND (DocFinanceiro.Numero IS NOT NULL)
AND (DocFinanceiro.Classe <> 1)
ORDER BY AutoId, Sequencia
;
If anybody has any ideas it would be great !!
try replace
RegistroPessoa.AutoId = (SELECT...)
to
RegistroPessoa.AutoId IN (SELECT...)
and use aliases for table short names