A new row for each record - sql

I would like the results to produce a new row in each instance where a condition is met. I'm using a CASE statement but this isn't the way to go since once the first condition is met it stops evaluating the field.
SELECT
Reviews.ReviewID,
CASE
WHEN Score_CorrectID = 0 THEN 'Correct ID Right Party Authentication'
WHEN Score_ProperlyIdentified = 0 THEN 'PCA Properly Identified Itself'
WHEN Score_MiniMiranda = 0 THEN 'Mini-Miranda'
END AS [Error Type]
FROM Reviews INNER JOIN PCAs ON Reviews.PCAID = PCAs.PCAID LEFT JOIN
PCARebuttal ON Reviews.ReviewID = PCARebuttal.ReviewID
WHERE
(Score_CorrectID = 0 OR Score_ProperlyIdentified = 0 OR Score_MiniMiranda =
0)
This produces this:
I would like this:

Use apply:
SELECT r.ReviewID, v.error_type
FROM Reviews r INNER JOIN
PCAs
ON r.PCAID = PCAs.PCAID LEFT JOIN
PCARebuttal pr
ON r.ReviewID = pr.ReviewID OUTER APPLY
(SELECT *
FROM (VALUES (Score_CorrectID, 'Correct ID Right Party Authentication'),
(Score_ProperlyIdentified, 'PCA Properly Identified Itself'),
(Score_MiniMiranda, 'Mini-Miranda')
) v(score, error_type)
WHERE score = 0
) v
WHERE (Score_CorrectID = 0 OR Score_ProperlyIdentified = 0 OR Score_MiniMiranda = 0);
That said, I would probably just concatenate the values into a single column:
SELECT r.ReviewID,
( (CASE WHEN Score_CorrectID = 0 THEN 'Correct ID Right Party Authentication; ' ELSE '' END) +
(CASE WHEN Score_ProperlyIdentified = 0 THEN 'PCA Properly Identified Itself; ' ELSE '' END) +
(CASE WHEN Score_MiniMiranda = 0 THEN 'Mini-Miranda;' ELSE '' END)
) as error_types
FROM Reviews r INNER JOIN
PCAs
ON r.PCAID = PCAs.PCAID LEFT JOIN
PCARebuttal pr
ON r.ReviewID = pr.ReviewID OUTER APPLY
(SELECT *
FROM (VALUES ()
) v(score, error_type)
WHERE score = 0
) v
WHERE (Score_CorrectID = 0 OR Score_ProperlyIdentified = 0 OR Score_MiniMiranda = 0);

Instead of using case, you can use union all instead:
SELECT
Reviews.ReviewID,
'Correct ID Right Party Authentication' AS [Error Type]
FROM Reviews
INNER JOIN PCAs ON Reviews.PCAID = PCAs.PCAID
LEFT JOIN PCARebuttal ON Reviews.ReviewID = PCARebuttal.ReviewID
WHERE Score_CorrectID = 0
UNION ALL
SELECT
Reviews.ReviewID,
'PCA Properly Identified Itself' AS [Error Type]
FROM Reviews
INNER JOIN PCAs ON Reviews.PCAID = PCAs.PCAID
LEFT JOIN PCARebuttal ON Reviews.ReviewID = PCARebuttal.ReviewID
WHERE Score_ProperlyIdentified = 0
UNION ALL
SELECT
Reviews.ReviewID,
'Mini-Miranda' AS [Error Type]
FROM Reviews
INNER JOIN PCAs ON Reviews.PCAID = PCAs.PCAID
LEFT JOIN PCARebuttal ON Reviews.ReviewID = PCARebuttal.ReviewID
WHERE Score_MiniMiranda = 0

Related

How can I remove the the union from this code?

I am attempting to remove the union in this sub-select due to performance issues. All attempts are unsuccessful because of how the AllocatedCRGReservedQty is calculated. How can I remove the union and combine the 2 select statements?
I was able to remove the union on the other portion of the query because it was based on a single where clause difference.
SELECT SrhCompanyID
,WhsPlantID
,SrhReason
,SrhRequestID
,SrdSeq
,SrdLotID
,SrdItemID
,InvQty
,SrdQty
,SrdSampleApprovedQty
,SrdUOM
,SohSalesOrder
,SohType
,AllocatedCRGReservedQty
FROM
( SELECT DISTINCT
SrhCompanyID
,WhsPlantID
,SrhReason
,SrhRequestID
,SrdSeq
,SrdLotID
,SrdItemID
,AsOfInventory InvQty
,SUM(SrdQty)
OVER (PARTITION BY SrdKey) SrdQty
,SUM(SrdSampleApprovedQty)
OVER (PARTITION BY SrdKey) SrdSampleApprovedQty
,SrdUOM
,SohSalesOrder
,SohType
,(SELECT SUM(SltLotAllocTranQty)
FROM SalesOrderLot
INNER JOIN
SalesOrderLotTran ON SltSolKey = SolKey
WHERE SolCompanyID = SodCompanyID AND
SolBranchID = SodBranchID AND
SolSalesOrder = SodSalesOrder AND
SolSalesOrderDtlKey = SodSalesOrderDtlKey AND
SolWipFgLotID = SrdLotID) AllocatedCRGReservedQty
FROM SampleRequestHdr
INNER JOIN SampleRequestDtl ON SrdSrhKey = SrhKey
INNER JOIN Warehouse ON WhsWhseID = SrhWhseID
INNER JOIN Lot ON LotCompanyID = SrhCompanyID AND
LotItemID = SrdItemID AND
LotID = SrdLotID
INNER JOIN #AsOfInventory ON IntLotKey = LotKey
-- Only include inventory transactions for completed production orders
-- Changed to temptable due to deadlocks on prodorder/prodorderreservation
INNER JOIN SalesOrderDtl ON SodCompanyID = SrhCompanyID AND
SodBranchID = SrdBranchID AND
SodSalesOrder = SrdSalesOrder AND
SodSalesOrderDtlKey = SrdSalesOrderDtlKey
INNER JOIN SalesOrderHdr ON SohCompanyID = SodCompanyID AND
SohBranchID = SodBranchID AND
SohSalesOrder = SodSalesOrder
WHERE SrhCompanyID = #CompanyID AND
((#PlantID <> '*' AND WhsPlantID = #PlantID) OR (#PlantID = '*')) AND
SrhApprovalExpireDate >= #As_Of_Date AND
ISNULL(SrdSampleRejected,'N') = 'N' AND
SohType IN ('Contract','Normal') AND
SrdQty <> 0
) WORK
WHERE ISNULL(AllocatedCRGReservedQty,0) < SrdQty -- if the lot is already allocated for at least the offered qty then don't include it so we don't over-state the gallons offered
UNION ALL -- then get the sample request qty offered for non-contract sales orders or no sales order assigned
SELECT SrhCompanyID
,WhsPlantID
,SrhReason
,SrhRequestID
,SrdSeq
,SrdLotID
,SrdItemID
,InvQty
,SrdQty
,SrdSampleApprovedQty
,SrdUOM
,SohSalesOrder
,SohType
,AllocatedCRGReservedQty
FROM
( SELECT DISTINCT
SrhCompanyID
,WhsPlantID
,SrhReason
,SrhRequestID
,SrdSeq
,SrdLotID
,SrdItemID
,AsOfInventory InvQty
,SUM(SrdQty)
OVER (PARTITION BY SrdKey) SrdQty
,SUM(SrdSampleApprovedQty)
OVER (PARTITION BY SrdKey) SrdSampleApprovedQty
,SrdUOM
,SohSalesOrder
,SohType
,(SELECT SUM(WptTranQty)
FROM WineProgram
CROSS APPLY
FN_CDV_WineProgramLotTranPlusPending(SrdLotID, WpgKey)
INNER JOIN
IntendedUse ON InuKey = WpgInuKey AND
InuIntendedUse = 'CRG'
LEFT JOIN
--ProdOrdDtl (NOLOCK) ON PodKey = wptPodKey
va_CDV_ProdOrder ON PodKey = wptPodKey
WHERE --WptLotID = SrdLotID AND
ISNULL(WptTranType,'') <> 'Pending' AND
((wptPodKey IS NOT NULL AND
(#CompletePOsOnly = 'N' OR -- include all POs
(#CompletePOsOnly = 'Y' AND PohCompleteDate IS NOT NULL))) -- Only include transactions if PO is Complete or if it's a non-PO transaction
OR
wptPodKey IS NULL
)
) AllocatedCRGReservedQty
FROM SampleRequestHdr
INNER JOIN SampleRequestDtl ON SrdSrhKey = SrhKey
INNER JOIN Warehouse ON WhsWhseID = SrhWhseID
INNER JOIN Lot ON LotCompanyID = SrhCompanyID AND
LotItemID = SrdItemID AND
LotID = SrdLotID
INNER JOIN
#AsOfInventory ON IntLotKey = LotKey
LEFT JOIN SalesOrderDtl ON SodCompanyID = SrhCompanyID AND
SodBranchID = SrdBranchID AND
SodSalesOrder = SrdSalesOrder AND
SodSalesOrderDtlKey = SrdSalesOrderDtlKey
LEFT JOIN SalesOrderHdr ON SohCompanyID = SodCompanyID AND
SohBranchID = SodBranchID AND
SohSalesOrder = SodSalesOrder
WHERE SrhCompanyID = #CompanyID AND
((#PlantID <> '*' AND WhsPlantID = #PlantID) OR (#PlantID = '*')) AND
SrhApprovalExpireDate >= #As_Of_Date AND
ISNULL(SrdSampleRejected,'N') = 'N' AND
ISNULL(SrdUseCRGReservation,'N') = 'N' AND -- if the SrdUseCRGReservation flag = "N" then return the sample qty
ISNULL(SohType,'') NOT IN ('Contract','Normal') AND -- offered to reduce the ATP (pseudo reservation until the sample expires or is approved/rejected)
SrdQty <> 0
) WORK

SQL Server 2016 - Stuff/XML Path

I have this basic query, bringing back configuration information. Each MatrixCellID is an individual ticket, and each can have multiple StatisticalGroupCodes and StatisicalGroupDescriptions. Currently each MatrixCellID appears multiple times because of its multiple StatisicalGroupCodes. I would like the Code and Description columns to show all in one column, comma separated.
This is my query:
select
cmc.MatrixSheetId,
CMS.MatrixSheetName,
cmc.MatrixCellId,
CMC.Price,
CMC.PriceListId,
CPL.PriceListName,
CPT.Description as PriceTable,
case when CMC.Code <> '' then cmc.code else 'EMPTY' end AS TicketCode,
case when CMC.Name <> '' then cmc.name else 'EMPTY' END AS TicketName,
case when CMC.Description <> '' then cmc.description else 'EMPTY' END AS TicketDescription,
case when CMC.Description2 <> '' then cmc.description2 else 'EMPTY' end AS AdditionalTicketDescription,
CASE WHEN CMCI.AccountMandatory = 1 THEN 'YES' else 'NO' end AS AccountMandatory,
CASE WHEN CDC.Description IS NULL THEN 'NONE' ELSE CDC.Description END AS AccountCategory,
CDT.DocTemplateName AS PrintTemplate,
CTP.Description as TaxPackage,
CT.TaxName,
CASE when CMC.PriceType = 0 then 'Fixed' else 'Variable' end as PriceType,
CCC.CostCenterDescription,
CCC.CostCenterCode,
CCC.CostCenterAK,
CSG.StatisticalGroupCode,
CSG.StatisticalGroupDescription
from
CNF_MatrixCell CMC
inner join CNF_MatrixSheet CMS on CMC.MatrixSheetId = CMS.MatrixSheetId
inner join CNF_PriceList CPL on CMC.PriceListId = CPL.PriceListId
INNER JOIN CNF_MatrixCellInfo CMCI on CMC.MatrixCellId = CMCI.MatrixCellId
left join CNF_DmgCategory CDC on CMCI.AccountDmgCatId = CDC.DmgCategoryId
left join CNF_DocTemplate CDT on CMC.DocTemplateId = CDT.DocTemplateId
LEFT join CNF_TaxPackage CTP on CMC.TaxPackageId = CTP.TaxPackageId
LEFT join CNF_Tax2Package CT2P on CTP.TaxPackageId = CT2P.TaxPackageId
LEFT JOIN CNF_Tax CT on CT2P.TaxId = CT.TaxId
LEFT JOIN CNF_CostCenter_Validity CCCV on CMC.MatrixCellId = cccv.MatrixCellId
LEFT JOIN CNF_CostCenter CCC on CCCV.CostCenterId = CCC.CostCenterId
inner join CNF_PriceTable CPT on CMC.PriceTableId = CPT.PriceTableId
LEFT JOIN CNF_StatisticalGroupValidity CSGV on CMC.MatrixCellId = CSGV.MatrixCellId
LEFT JOIN CNF_StatisticalGroup CSG on CSGV.StatisticalGroupId = CSG.StatisticalGroupId
WHERE CMC.Enabled = 1
AND CCC.Enabled = 1
AND CPT.Enabled = 1
AND CMS.Enabled = 1
ORDER BY
CMS.MatrixSheetId,
CMC.MatrixCellId,
CMC.Code
I have tried to use Stuff and XML Path, but cannot get it work correctly with my joins.
Thank you in advance.
You can use this.
select
cmc.MatrixSheetId,
CMS.MatrixSheetName,
cmc.MatrixCellId,
CMC.Price,
CMC.PriceListId,
CPL.PriceListName,
CPT.Description as PriceTable,
case when CMC.Code <> '' then cmc.code else 'EMPTY' end AS TicketCode,
case when CMC.Name <> '' then cmc.name else 'EMPTY' END AS TicketName,
case when CMC.Description <> '' then cmc.description else 'EMPTY' END AS TicketDescription,
case when CMC.Description2 <> '' then cmc.description2 else 'EMPTY' end AS AdditionalTicketDescription,
CASE WHEN CMCI.AccountMandatory = 1 THEN 'YES' else 'NO' end AS AccountMandatory,
CASE WHEN CDC.Description IS NULL THEN 'NONE' ELSE CDC.Description END AS AccountCategory,
CDT.DocTemplateName AS PrintTemplate,
CTP.Description as TaxPackage,
CT.TaxName,
CASE when CMC.PriceType = 0 then 'Fixed' else 'Variable' end as PriceType,
CCC.CostCenterDescription,
CCC.CostCenterCode,
CCC.CostCenterAK,
STUFF(StatGrpCode.StatGroupCodes,1,1,'') StatGroupCodes,
STUFF(StatGrpCodeDesc.StatGroupDescription,1,1,'') StatGroupDescription
from
CNF_MatrixCell CMC
inner join CNF_MatrixSheet CMS on CMC.MatrixSheetId = CMS.MatrixSheetId
inner join CNF_PriceList CPL on CMC.PriceListId = CPL.PriceListId
INNER JOIN CNF_MatrixCellInfo CMCI on CMC.MatrixCellId = CMCI.MatrixCellId
left join CNF_DmgCategory CDC on CMCI.AccountDmgCatId = CDC.DmgCategoryId
left join CNF_DocTemplate CDT on CMC.DocTemplateId = CDT.DocTemplateId
LEFT join CNF_TaxPackage CTP on CMC.TaxPackageId = CTP.TaxPackageId
LEFT join CNF_Tax2Package CT2P on CTP.TaxPackageId = CT2P.TaxPackageId
LEFT JOIN CNF_Tax CT on CT2P.TaxId = CT.TaxId
LEFT JOIN CNF_CostCenter_Validity CCCV on CMC.MatrixCellId = cccv.MatrixCellId
LEFT JOIN CNF_CostCenter CCC on CCCV.CostCenterId = CCC.CostCenterId
inner join CNF_PriceTable CPT on CMC.PriceTableId = CPT.PriceTableId
LEFT JOIN CNF_StatisticalGroupValidity CSGV on CMC.MatrixCellId = CSGV.MatrixCellId
OUTER APPLY
( SELECT ', ' + CSG.StatisticalGroupCode
FROM CNF_StatisticalGroup CSG
WHERE CSGV.StatisticalGroupId = CSG.StatisticalGroupId FOR XML PATH('') ) StatGrpCode (StatGroupCodes)
OUTER APPLY
( SELECT ', ' + CSG.StatisticalGroupDescription
FROM CNF_StatisticalGroup CSG
WHERE CSGV.StatisticalGroupId = CSG.StatisticalGroupId FOR XML PATH('') ) StatGrpCodeDesc (StatGroupDescription)
WHERE CMC.Enabled = 1
AND CCC.Enabled = 1
AND CPT.Enabled = 1
AND CMS.Enabled = 1
ORDER BY
CMS.MatrixSheetId,
CMC.MatrixCellId,
CMC.Code

ORA-01799: a column may not be outer-joined to a subquery

hi good people please find the code below is running in db2 but fails in oracle.
select * from
(select distinct e.time_stamp,e.applicationid, e.processname,
e.stage, e.initiatingsource, e.status, e.start_time, i.consultant,
g.cifnumber, g.applicantfirstname, g.applicantlastname,
case when e.branch is not null
then e.branch
else case when g.branch is not null
then g.branch
else i.branch
end
end as branch
from (select c.time_stamp, b.applicationid, b.processname,
b.stage, b.branch, b.initiatingsource,
case when d.status is null
then c.status
else d.status
end as status,
c.time_stamp as START_TIME,
case when d.time_stamp is not null
then d.time_stamp
else current_timestamp
ens as END_TIME
from (select distinct f.applicationid, f.branch, f.initiatingsource, f.processname,
case when f.stage in ('START''END')
then 'APPLICATION'
else f.stage, f.stagecounter
from processmetric f) b
left join processmetric c on b.applicationid = c.applicationid and b.processname = c.processname and (b.stage = c.stage or (b.stage = 'APPLICATION' and c.stage = 'START')) and b.stagecounter = c.stagecounter and c.phase = 'START'
left join processmetric d on b.applicationid = d.applicationid and b.processname = d.processname and (b.stage = d.stage or (b.stage = 'APPLICATION' and d.stage = 'END')) and b.stagecounter = d.stagecounter and d.phase ='END')e
left join applicationcustomerdata g on g.applicationid = e.applicationid
and g.time_stamp in (select max(x.time_stamp)
from applicationcustomerdata x
where x.applicationid = g.applicationid
)
left join applicationdata i on i.applicationid = e.applicationid
and i.time_stamp in (select max(z.time_stamp)
from applicationdata z
where z.applicationid = i.applicationid
)
order by e.start_time
) a
where a.start_time is not null and a.stage not in ('APPLICATION') and a.status not in ('COMPLETE' , 'COMPLETED' , 'CANCEL', 'FRAUD' , 'DECLINE') and a.stage = 'VERIFICATION';
Oracle don't allow to make outer join with subquery. Following 2 joins are problematic ones:
left join applicationcustomerdata g on g.applicationid = e.applicationid
and g.time_stamp in (select max(x.time_stamp)
from applicationcustomerdata x
where x.applicationid = g.applicationid
)
left join applicationdata i on i.applicationid = e.applicationid
and i.time_stamp in (select max(z.time_stamp)
from applicationdata z
where z.applicationid = i.applicationid
)
You need to rewrite statement (if you need this all in one SQL) or write some PL/SQL loops through data.

Syntax error on request optimisation

I'm trying to optimize a SQL query but I face a weird issue.
Here is my optimized request :
SELECT proj.ProjetId AS ProjetId,
SUM (CASE WHEN modTrans.Code != 'FoO' THEN 1 ELSE 0 END) AS VAL1,
SUM(CASE WHEN modTrans.Code = 'Foo' THEN 1 ELSE 0 END) AS VAL2
FROM Projet.Projet proj
INNER JOIN Workflow.PointControle ptCont
ON ptCont.ProjetId = proj.ProjetId
INNER JOIN Workflow.PointControleModele ptContMod
ON ptContMod.PointControleModeleId = ptCont.PointControleModeleId
INNER JOIN Commande.CommandeTAC cdeTAC
ON cdeTAC.ProjetId = proj.ProjetId
INNER JOIN Commande.CommandeTACCatalogue cdeTACCat
ON cdeTACCat.CommandeTACId = cdeTAC.CommandeTACId
INNER JOIN Fournisseur.Fournisseur four
ON four.FournisseurId = cdeTACCat.FournisseurId
INNER JOIN Fournisseur.ModeTransmission modTrans
ON modTrans.ModeTransmissionId = four.ModeTransmissionId
WHERE ptContMod.PointControleModeleCode = 'FFooooooooo'
AND ptCont.Etat = 'Foooooo'
AND proj.DateLivraison IS NOT NULL
AND [proj].[DateLivraison] <= DATEADD(DAY, 14, GETDATE())
GROUP BY proj.ProjetId
HAVING COUNT(VAL1) > 0 AND COUNT(VAL2) = 0
I got this error :
Column name invalid : 'VAL1' Column name invalid : 'VAL2'
The error is in the HAVING section.
After reading this documentation I dont undestand why there is an error because I respect the syntax : http://www.w3schools.com/sql/sql_having.asp
You can find the unoptimized complete request here :
BEGIN
WITH Trans(VAL1, VAL2, projetId) AS
(
SELECT SUM (CASE WHEN modTrans.Code != 'Foo' THEN 1 ELSE 0 END) AS NbNonSALM
, SUM(CASE WHEN modTrans.Code = 'Foo' THEN 1 ELSE 0 END) AS NbSALM
, proj.ProjetId AS projetId
FROM Projet.Projet proj
INNER JOIN Workflow.PointControle ptCont
ON ptCont.ProjetId = proj.ProjetId
INNER JOIN Workflow.PointControleModele ptContMod
ON ptContMod.PointControleModeleId = ptCont.PointControleModeleId
INNER JOIN Commande.CommandeTAC cdeTAC
ON cdeTAC.ProjetId = proj.ProjetId
INNER JOIN Commande.CommandeTACCatalogue cdeTACCat
ON cdeTACCat.CommandeTACId = cdeTAC.CommandeTACId
INNER JOIN Fournisseur.Fournisseur four
ON four.FournisseurId = cdeTACCat.FournisseurId
INNER JOIN Fournisseur.ModeTransmission modTrans
ON modTrans.ModeTransmissionId = four.ModeTransmissionId
WHERE ptContMod.PointControleModeleCode = 'Foooooo'
AND ptCont.Etat = 'Fooo'
AND proj.DateLivraison IS NOT NULL
AND DATEADD(DAY, -14, proj.DateLivraison) <= GETDATE()
GROUP BY proj.ProjetId
)
SELECT proj.ProjetId AS ProjetId
FROM Projet.Projet proj
INNER JOIN Workflow.PointControle ptCont
ON ptCont.ProjetId = proj.ProjetId
INNER JOIN Workflow.PointControleModele ptContMod
ON ptContMod.PointControleModeleId = ptCont.PointControleModeleId
INNER JOIN Commande.CommandeTAC cdeTAC
ON cdeTAC.ProjetId = proj.ProjetId
INNER JOIN Commande.CommandeTACCatalogue cdeTACCat
ON cdeTACCat.CommandeTACId = cdeTAC.CommandeTACId
INNER JOIN Fournisseur.Fournisseur four
ON four.FournisseurId = cdeTACCat.FournisseurId
INNER JOIN Fournisseur.ModeTransmission modTrans
ON modTrans.ModeTransmissionId = four.ModeTransmissionId
INNER JOIN Trans ON Trans.projetId = proj.ProjetId
WHERE ptContMod.PointControleModeleCode = 'Foo'
AND ptCont.Etat = 'Fooo'
AND proj.DateLivraison IS NOT NULL
AND DATEADD(DAY, -14, proj.DateLivraison) <= GETDATE()
GROUP BY proj.ProjetId
HAVING COUNT(trans.NbNonSALM) > 0 AND COUNT(trans.NbSALM) = 0
UNION
SELECT projet.ProjetId AS ProjetId
FROM Projet.Projet projet
INNER JOIN Workflow.PointControle ptControle
ON ptControle.ProjetId = projet.ProjetId
INNER JOIN Workflow.PointControleModele ptContMod
ON ptContMod.PointControleModeleId = ptControle.PointControleModeleId
INNER JOIN Commande.CommandeTAC cdeTAC
ON cdeTAC.ProjetId = projet.ProjetId
INNER JOIN Commande.CommandeTACCatalogue cdeTACCat
ON cdeTACCat.CommandeTACId = cdeTAC.CommandeTACId
INNER JOIN commande.AREntete arEnt
ON arEnt.ProjetIdTAC = cdeTAC.ProjetIdTAC
INNER JOIN Commande.Article art
ON art.AREnteteId = arEnt.AREnteteId AND art.CommandeTACCatalogueId = cdeTACCat.CommandeTACCatalogueId
INNER JOIN Fournisseur.Fournisseur four
ON four.FournisseurId = cdeTACCat.FournisseurId
INNER JOIN Fournisseur.ModeTransmission modTrans
ON modTrans.ModeTransmissionId = four.ModeTransmissionId
WHERE ptContMod.PointControleModeleCode = 'Fooo'
AND ptControle.Etat = 'Foo'
AND arEnt.SuppressionLogique = 0
AND arEnt.Statut IS NOT NULL
AND arEnt.Statut >= 4
AND arEnt.Statut != 9
AND modTrans.Code = 'Fooooooo'
AND projet.SiteId = #siteId
END
;
I am not try this, but I think it work for you.. Or you can give some sample data if error comes.
;WITH CTE AS
(
SELECT proj.ProjetId AS ProjetId,
SUM (CASE WHEN modTrans.Code != 'FoO' THEN 1 ELSE 0 END) AS VAL1,
SUM(CASE WHEN modTrans.Code = 'Foo' THEN 1 ELSE 0 END) AS VAL2
FROM Projet.Projet proj
INNER JOIN Workflow.PointControle ptCont
ON ptCont.ProjetId = proj.ProjetId
INNER JOIN Workflow.PointControleModele ptContMod
ON ptContMod.PointControleModeleId = ptCont.PointControleModeleId
INNER JOIN Commande.CommandeTAC cdeTAC
ON cdeTAC.ProjetId = proj.ProjetId
INNER JOIN Commande.CommandeTACCatalogue cdeTACCat
ON cdeTACCat.CommandeTACId = cdeTAC.CommandeTACId
INNER JOIN Fournisseur.Fournisseur four
ON four.FournisseurId = cdeTACCat.FournisseurId
INNER JOIN Fournisseur.ModeTransmission modTrans
ON modTrans.ModeTransmissionId = four.ModeTransmissionId
WHERE ptContMod.PointControleModeleCode = 'FFooooooooo'
AND ptCont.Etat = 'Foooooo'
AND proj.DateLivraison IS NOT NULL
AND [proj].[DateLivraison] <= DATEADD(DAY, 14, GETDATE())
GROUP BY proj.ProjetId
)
SELECT ProjetId, VAL1, VAL2
FROM CTE
GROUP BY ProjetId, VAL1, VAL2
HAVING COUNT(VAL1) > 0 AND COUNT(VAL2) = 0
You cannot use the alias in the HAVING clause. Replace with this instead:
HAVING
SUM(CASE WHEN modTrans.Code != 'FoO' THEN 1 ELSE 0 END) > 0
AND SUM(CASE WHEN modTrans.Code = 'Foo' THEN 1 ELSE 0 END) = 0
Replace your HAVING clause with this
HAVING
SUM (CASE WHEN modTrans.Code != 'FoO' THEN 1 ELSE 0 END)>0
AND
SUM(CASE WHEN modTrans.Code = 'Foo' THEN 1 ELSE 0 END)=0

SQL JOIN only on specific CASE

I have a stored procedure where I have to join a table only on rows where a bit field for that record is 0. Is this possible? Here's what I have/need
SELECT TOP 100
SR.ServiceRecordID,
dbo.fn_ServiceRecordGetServiceName(SR.ServiceRecordID,''),
SR.LocationStd,
SR.AreaServedStd,
SR.RegionalLimited,
R.Region,
CASE WHEN (ISNULL(R_SR.RegionID,0) = 0 AND ISNULL(R_SR_Serv.RegionID,0) = 0)
THEN 0 ELSE 1 END AS Visible,
NULL
FROM ServiceRecord SR
INNER JOIN Sites S
ON SR.SiteID = S.SiteID
INNER JOIN Regions R
ON R.SiteID = S.SiteID
LEFT OUTER JOIN lkup_Region_ServiceRecord R_SR
ON R_SR.RegionID = R.RegionID
AND R_SR.ServiceRecordID = SR.ServiceRecordID
--and this is the additional join I need ONLY if RegionalLimited = 0
CASE WHEN SR.RegionalLimited = 0 THEN
LEFT OUTER JOIN lkup_Region_ServiceRecord_Serv R_SR_Serv
ON R_SR_Serv.RegionID = R.RegionID
AND R_SR_Serv.ServiceRecordID = SR.ServiceRecordID
END
WHERE SR.SiteID = #SiteID
AND R.RegionID % 100 != 0
This should work
SELECT TOP 100 SR.ServiceRecordID, dbo.fn_ServiceRecordGetServiceName(SR.ServiceRecordID,''),
SR.LocationStd, SR.AreaServedStd,
SR.RegionalLimited, R.Region,
CASE WHEN (ISNULL(R_SR.RegionID,0) = 0 AND ISNULL(R_SR_Serv.RegionID,0) = 0) THEN 0 ELSE 1 END AS Visible,NULL
FROM ServiceRecord SR
INNER JOIN Sites S ON SR.SiteID = S.SiteID
INNER JOIN Regions R ON R.SiteID = S.SiteID
LEFT OUTER JOIN lkup_Region_ServiceRecord R_SR ON R_SR.RegionID = R.RegionID
AND R_SR.ServiceRecordID = SR.ServiceRecordID
LEFT OUTER JOIN lkup_Region_ServiceRecord_Serv R_SR_Serv
ON R_SR_Serv.RegionID = R.RegionID
AND R_SR_Serv.ServiceRecordID = SR.ServiceRecordID
AND SR.RegionalLimited = 0 -- this is the trick
WHERE SR.SiteID = #SiteID
AND R.RegionID % 100 != 0
I have added this condition AND SR.RegionalLimited = 0 to the left outer join with lkup_Region_ServiceRecord