I have following query and i am getting perfect result what i want but i want to use stManufacturerPartReference alias in where clause condition Like following second query but it gives me error.
WITH ProductsCTE (inProductId, inCategoryId, stCategory, stManufacturers, inCompanyId, stERPId,stManufacturerPartReference,
stProductName, stProductNumber, stModel, stFileLink, stImage, dcPrice,dcStandardPrice, dcOnHandQty,dcQtyOnPO,dtEstimatedShipDate, dcWeight, inSyncStatus, dtLastSyncDate,
inErrorRetry,flgIsActive, flgIsDeleted, inCreatedBy, inModifiedBy, dtModificationDate, dtCreationDate, inRecordCount)
AS (
SELECT
product.inProductId,
product.inCategoryId,
product.stCategory,
product.stManufacturers,
product.inCompanyId,
product.stERPId,
product.stProductName,
STUFF((SELECT ', ' + PM.stManufacturerPartReference
FROM tblProductManufacturers PM
JOIN tblProducts Product on PM.inProductId = Product.inProductId
JOIN tblManufacturers M on M.inManufacturerId = PM.inManufacturerId
WHERE PM.inProductId=product.inProductId
ORDER BY M.stManufacturer
FOR XML PATH('')), 1, 1, '') as stManufacturerPartReference,
product.stProductNumber,
product.stModel,
product.stFileLink,
product.stImage,
product.dcPrice,
product.dcStandardPrice,
product.dcOnHandQty,
product.dcQtyOnPO,
product.dtEstimatedShipDate,
product.dcWeight,
product.inSyncStatus,
product.dtLastSyncDate,
product.inErrorRetry,
product.flgIsActive,
product.flgIsDeleted,
product.inCreatedBy,
product.inModifiedBy,
product.dtModificationDate,
product.dtCreationDate,
CAST((COUNT(product.inProductId) OVER()) AS BIGINT) AS inRecordCount
FROM tblProducts Product WITH (NOLOCK)
WHERE 1=1
AND product.flgIsDeleted <> 1
AND flgIsHistoricItem <> 1 AND (product.inCompanyId = 1) )
SELECT P.inProductId,
P.inCategoryId,
P.stCategory,
P.stManufacturers,
P.stManufacturerPartReference,
P.inCompanyId,
P.stERPId,
P.stProductName,
P.stProductNumber,
P.stModel,
P.stFileLink,
P.stImage,
P.dcPrice,
P.dcStandardPrice,
P.dcOnHandQty,
P.dcQtyOnPO,
P.dtEstimatedShipDate,
P.dcWeight,
P.inSyncStatus,
P.dtLastSyncDate,
P.inErrorRetry,
P.flgIsActive,
P.flgIsDeleted,
P.inCreatedBy,
P.inModifiedBy,
P.dtModificationDate,
P.dtCreationDate,
P.inRecordCount
FROM ProductsCTE P
ORDER BY stCategory ASC
OFFSET (1 - 1) * 1000 ROWS
FETCH NEXT 1000 ROWS ONLY;
i want to use stManufacturerPartReference in Where Clause Like Following.
WITH ProductsCTE (inProductId, inCategoryId, stCategory, stManufacturers, inCompanyId, stERPId,stManufacturerPartReference,
stProductName, stProductNumber, stModel, stFileLink, stImage, dcPrice,dcStandardPrice, dcOnHandQty,dcQtyOnPO,dtEstimatedShipDate, dcWeight, inSyncStatus, dtLastSyncDate,
inErrorRetry,flgIsActive, flgIsDeleted, inCreatedBy, inModifiedBy, dtModificationDate, dtCreationDate, inRecordCount)
AS (
SELECT
product.inProductId,
product.inCategoryId,
product.stCategory,
product.stManufacturers,
product.inCompanyId,
product.stERPId,
product.stProductName,
STUFF((SELECT ', ' + PM.stManufacturerPartReference
FROM tblProductManufacturers PM
JOIN tblProducts Product on PM.inProductId = Product.inProductId
JOIN tblManufacturers M on M.inManufacturerId = PM.inManufacturerId
WHERE PM.inProductId=product.inProductId
ORDER BY M.stManufacturer
FOR XML PATH('')), 1, 1, '') as stManufacturerPartReference,
product.stProductNumber,
product.stModel,
product.stFileLink,
product.stImage,
product.dcPrice,
product.dcStandardPrice,
product.dcOnHandQty,
product.dcQtyOnPO,
product.dtEstimatedShipDate,
product.dcWeight,
product.inSyncStatus,
product.dtLastSyncDate,
product.inErrorRetry,
product.flgIsActive,
product.flgIsDeleted,
product.inCreatedBy,
product.inModifiedBy,
product.dtModificationDate,
product.dtCreationDate,
CAST((COUNT(product.inProductId) OVER()) AS BIGINT) AS inRecordCount
FROM tblProducts Product WITH (NOLOCK)
WHERE 1=1
AND product.flgIsDeleted <> 1
AND flgIsHistoricItem <> 1 AND (product.inCompanyId = 1) AND stManufacturerPartReference LIKE '%ABC DEF%' )
SELECT P.inProductId,
P.inCategoryId,
P.stCategory,
P.stManufacturers,
P.stManufacturerPartReference,
P.inCompanyId,
P.stERPId,
P.stProductName,
P.stProductNumber,
P.stModel,
P.stFileLink,
P.stImage,
P.dcPrice,
P.dcStandardPrice,
P.dcOnHandQty,
P.dcQtyOnPO,
P.dtEstimatedShipDate,
P.dcWeight,
P.inSyncStatus,
P.dtLastSyncDate,
P.inErrorRetry,
P.flgIsActive,
P.flgIsDeleted,
P.inCreatedBy,
P.inModifiedBy,
P.dtModificationDate,
P.dtCreationDate,
P.inRecordCount
FROM ProductsCTE P
ORDER BY stCategory ASC
OFFSET (1 - 1) * 1000 ROWS
FETCH NEXT 1000 ROWS ONLY;
But it Gives me Error "Invalid column name 'stManufacturerPartReference'."
So how can i use alias in where clause please help.
thanks.
I would do instead :
SELECT *, STUFF(stManufacturerPartReference, 1, 1, '') AS stManufacturerPartReference
FROM . . . .
. . . . CROSS APPLY
( SELECT ', ' + PM.stManufacturerPartReference
FROM tblProductManufacturers PM JOIN
tblProducts Product
ON PM.inProductId = Product.inProductId JOIN
tblManufacturers M
ON M.inManufacturerId = PM.inManufacturerId
WHERE PM.inProductId=product.inProductId
FOR XML PATH('')
) tt(stManufacturerPartReference)
WHERE . . . AND
stManufacturerPartReference LIKE '%ABC DEF%';
You need to learn about the order of execution in a SQL query: https://sqlbolt.com/lesson/select_queries_order_of_execution
WHERE comes immediately after FROM, and therefore any aliases are not available to filter on.
As it's wrapped in a CTE, filter on stManufacturerPartReference in the query after it.
WITH ProductsCTE (inProductId, inCategoryId, stCategory, stManufacturers, inCompanyId, stERPId,stManufacturerPartReference,
stProductName, stProductNumber, stModel, stFileLink, stImage, dcPrice,dcStandardPrice, dcOnHandQty,dcQtyOnPO,dtEstimatedShipDate, dcWeight, inSyncStatus, dtLastSyncDate,
inErrorRetry,flgIsActive, flgIsDeleted, inCreatedBy, inModifiedBy, dtModificationDate, dtCreationDate, inRecordCount)
AS (
SELECT
product.inProductId,
product.inCategoryId,
product.stCategory,
product.stManufacturers,
product.inCompanyId,
product.stERPId,
product.stProductName,
STUFF((SELECT ', ' + PM.stManufacturerPartReference
FROM tblProductManufacturers PM
JOIN tblProducts Product on PM.inProductId = Product.inProductId
JOIN tblManufacturers M on M.inManufacturerId = PM.inManufacturerId
WHERE PM.inProductId=product.inProductId
ORDER BY M.stManufacturer
FOR XML PATH('')), 1, 1, '') as stManufacturerPartReference,
product.stProductNumber,
product.stModel,
product.stFileLink,
product.stImage,
product.dcPrice,
product.dcStandardPrice,
product.dcOnHandQty,
product.dcQtyOnPO,
product.dtEstimatedShipDate,
product.dcWeight,
product.inSyncStatus,
product.dtLastSyncDate,
product.inErrorRetry,
product.flgIsActive,
product.flgIsDeleted,
product.inCreatedBy,
product.inModifiedBy,
product.dtModificationDate,
product.dtCreationDate,
CAST((COUNT(product.inProductId) OVER()) AS BIGINT) AS inRecordCount
FROM tblProducts Product WITH (NOLOCK)
WHERE 1=1
AND product.flgIsDeleted 1
AND flgIsHistoricItem 1 AND (product.inCompanyId = 1) )
SELECT P.inProductId,
P.inCategoryId,
P.stCategory,
P.stManufacturers,
P.stManufacturerPartReference,
P.inCompanyId,
P.stERPId,
P.stProductName,
P.stProductNumber,
P.stModel,
P.stFileLink,
P.stImage,
P.dcPrice,
P.dcStandardPrice,
P.dcOnHandQty,
P.dcQtyOnPO,
P.dtEstimatedShipDate,
P.dcWeight,
P.inSyncStatus,
P.dtLastSyncDate,
P.inErrorRetry,
P.flgIsActive,
P.flgIsDeleted,
P.inCreatedBy,
P.inModifiedBy,
P.dtModificationDate,
P.dtCreationDate,
P.inRecordCount
FROM ProductsCTE P
WHERE P.stManufacturerPartReference LIKE '%ABC DEF%'
ORDER BY stCategory ASC
OFFSET (1 - 1) * 1000 ROWS
FETCH NEXT 1000 ROWS ONLY;
You have to use outer apply or cross apply (select .. AS stManufacturerPartReference) and if your server is 2017 you could use String_AGG function to get list of values instead of for xml clause.
In the following screenshot, I would like to merge the data in the YorumYapanAdsoyad column on a single line.
enter image description here
It should be this way;
8 | Fiat Linea 1.3 Multijet | Ahmet, Selami
12 | Vw Golf | Ertem, Selim
Thanks for the help ;)
Try this ,for earlier versions on SQL (2016 and down)
;WITH Tmp (UrunId, Araclar , YorumYapanSoyad) as
(
SELECT 8 , 'Fiat Line 1.3 Multijet' , 'Ahmet'
UNION ALL
SELECT 8 , 'Fiat Line 1.3 Multijet' , 'Selami'
UNION ALL
SELECT 12 , 'Vw Golf' , 'Ertem'
UNION ALL
SELECT 12 , 'Vw Golf' , 'Selim'
)
SELECT UrunId , Araclar ,
(SELECT STUFF(
(SELECT ', ' + YorumYapanSoyad
FROM Tmp b
WHERE B.Araclar = T.Araclar
AND b.UrunId = t.UrunId
FOR XML PATH (''),TYPE).value('.','nvarchar(max)'),1,2,'')
) YorumYapanSoyad
FROM Tmp t
GROUP BY UrunId , Araclar
Try this
DECLARE #Table TABLE (ID INT,Araclar varchar(100),YorumYapan varchar(20))
INSERT INTO #Table
SELECT 8 , 'Fiat Linea 1.3 Multijet' , 'Ahmet' UNION ALL
SELECT 8 , 'Fiat Linea 1.3 Multijet' , 'Selami' UNION ALL
SELECT 12 , 'Vw Golf' , 'Ertem' UNION ALL
SELECT 12 , 'Vw Golf' , 'Selim'
SELECT DISTINCT ID
,Araclar
,STUFF((SELECT ', '+YorumYapan
FROM #Table i WHERE i.ID=o.ID FOR XML PATH ('')),1,1,'') AS YorumYapan
FROM #Table o
Result
ID Araclar YorumYapan
------------------------------------------
8 Fiat Linea 1.3 Multijet Ahmet, Selami
12 Vw Golf Ertem, Selim
This is the recipe I use. As I don't know your table names, I made this example using sys.tables and sys.columns. Basically, the function STUFF is your friend here.
SELECT
t.name,
STUFF
(
(
SELECT ', ' + c.name
FROM sys.columns c
WHERE c.object_id = t.object_id
FOR XML PATH('')
),
1, /*string start*/
2, /*string length*/
'' /*replaceWith*/
)
FROM sys.tables t
Having two tables, I want to convert some rows to columns. My database engine is Microsoft SQL Server. The image below illustrates my desired result.
Your question is not so clear, but it seems you want to use SQL PIVOT
Sample Data
DECLARE #tblModule TABLE(modId INT,name VARCHAR(200))
DECLARE #tblProfile TABLE(id INT,modId INT,profil VARCHAR(200))
INSERT INTO #tblModule
SELECT 1,'Manteniminento' UNION
SELECT 2 , 'Soporte'
INSERT INTO #tblProfile
SELECT 1,1,'Administrador' UNION
SELECT 2,2 , 'Empleado' UNION
SELECT 3,1 , 'Empleado' UNION
SELECT 4,1 , 'Empleado' UNION
SELECT 5,1 , 'Administrador' UNION
SELECT 6,1 , 'Administrador'
Main query
SELECT name,SUM([Administrador]) AS Administrador, SUM([Empleado]) AS Empleado
FROM
(SELECT id,p.modId,m.name,p.profil
FROM #tblProfile p
INNER JOIN #tblModule m ON m.modId = p.modId) AS SourceTable
PIVOT
(
COUNT(modId)
FOR profil IN ([Administrador], [Empleado])
) AS PivotTable
GROUP BY name
Result
name Administrador Empleado
Manteniminento 3 2
Soporte 0 1
I found the solution to what I needed. I share with you I made use of SQL STUFF:
SELECT A.codEmpresa
,A.nomEmpresa
,A.codSistema
,A.nomSistema
,A.codPerfil
,A.nomPerfil
,modulos = STUFF((SELECT DISTINCT ', ' + M.nomModulo
FROM smpseg.[0004] R
JOIN smpseg.[0014] SMOP
ON SMOP.codSistema = R.codSistema
AND SMOP.codModulo = R.codModulo
AND SMOP.codPerfil = A.codPerfil
AND SMOP.objDefault = CAST(1 AS BIT)
JOIN smpseg.[0011] O
ON O.codSistema = SMOP.codSistema
AND O.codModulo = SMOP.codModulo
AND O.codObjeto = SMOP.codObjeto
JOIN smpseg.[0010] M
ON M.codSistema = O.codSistema
AND M.codModulo = O.codModulo
WHERE R.codUsuario = #p_codUsuario
FOR XML PATH('')), 1, 2, '') FROM smpseg.[0004] A
JOIN smpseg.[0016] U
ON U.codUsuario = A.codUsuario