J'ai une table de command de magasin avec le code d'article, la description ReleaseDate et la quantité exigée. Comment effectuer une requête dans un format de tableau croisé dynamic de sorte que les résultats soient pivotés en utilisant Year + Month de [ReleaseDate] dans l'ordre de sorting de la date la plus ancienne à la dernière date. Utiliser l'année + mois comme une colonne.
C'est ma requête mais elle échoue.
--Declare necessary variables DECLARE @SQLQuery AS NVARCHAR(MAX) DECLARE @PivotColumns AS NVARCHAR(MAX) --Get unique values of pivot column SELECT @PivotColumns = COALESCE(@PivotColumns + ',','') + QUOTENAME([YEARMONTH]) FROM (SELECT DISTINCT CONVERT(char(6), cast([releaseddate] as date), 112 ) as [YEARMONTH] FROM [dbo].[ShopOrder]) as PivotQuery SELECT @PivotColumns --Create the dynamic query with all the values for --pivot column at runtime SET @SQLQuery = N'SELECT ItemCode, ' + @PivotColumns + ' FROM [dbo].[ShopOrder] PIVOT( SUM(RequiredQty) FOR [releaseddate] IN (' + @PivotColumns + ')) AS P' SELECT @SQLQuery --Execute dynamic query EXEC sp_executesql @SQLQuery
C'est le disque original
La requête de résultats doit être comme ceci
Vous ne pivotez pas correctement et les noms de colonne doivent être générés dans une seule string. Essaye ça:
CREATE TABLE ShopOrder (ItemCode VARCHAR(100),[Description] VARCHAR(100),ReleaseDate DATE, RequiredQty INT) GO INSERT INTO ShopOrder VALUES ('A','SLEEVE NUT','08/01/2017',19200) ,('A','SLEEVE NUT','08/02/2017',18000) ,('A','SLEEVE NUT','09/01/2017',17000) ,('B','STARTER','08/03/2017',10000) ,('B','STARTER','08/04/2017',18000) ,('B','STARTER','09/15/2017',16000) DECLARE @SQLQuery AS NVARCHAR(MAX) DECLARE @PivotColumns AS NVARCHAR(MAX) SET @PivotColumns = STUFF(( SELECT DISTINCT ',[' + CONVERT(char(6), cast(ReleaseDate as date), 112 ) + ']' FROM ShopOrder ORDER BY ',[' + CONVERT(char(6), cast(ReleaseDate as date), 112 ) + ']' FOR XML PATH('')),1,1,'') SET @SQLQuery = N' SELECT ItemCode,'+ @PivotColumns + ' FROM (SELECT ItemCOde,CONVERT(char(6), cast(ReleaseDate as date),112) ReleaseDate, RequiredQty FROM ShopOrder) AS T PIVOT( SUM(RequiredQty) FOR ReleaseDate IN ('+@PivotColumns+')) AS P ' SELECT @SQLQuery --Execute dynamic query EXEC sp_executesql @SQLQuery
Ici, j'ai essayé d'exécuter le pivot avec vos données fournies.
Question
Select [ItemCode], [Description], [2017/8], [2017/9] from ( select cast(year(ReleasedDate) as nvarchar)+'/'+cast(month(ReleasedDate) as nvarchar) as ReleasedDate,ItemCode,Description,RequiredQty from shoporder) as PivotData Pivot ( sum(RequiredQty) for ReleasedDate in ([2017/8],[2017/9])) as Pivoting order by ItemCode
Sortie:
Violon