2010-02-05 4 views
2

Bonjour,Comment utiliser PIVOT dans SQL Server 2005 stockée Procédure d'adhésion Deux Vues

J'ai 2 vues: ICCUDays qui contient un enregistrement par compte avec des champs compte et ICCUDays, ICCUEnctrSelectedRevCatsDirCost qui contient plusieurs enregistrements par compte avec des champs ACCOUNT, UBCATEGORY et DirectCost.

Mon objectif: créer une procédure stockée qui génère un enregistrement par ACCOUNT avec ICCUDays et DirectCost par UBCATEGORY. Ce sera un tableau croisé ou un pivot et doit permettre la possibilité de null dans un ou plusieurs seau de catégorie de coût direct. Enfin, ce tableau croisé ou ce pivot doit être envoyé à une nouvelle table EnctrUBCatPivot. Questions: Quelle est la syntaxe PIVOT correcte pour le scénario ci-dessus? Étant donné que je veux surpasser le coût direct pour de nombreuses entrées UBCATEGORY, comment écrire le TSQL pour itérer sur ceux-ci et pivoter par compte et UBCATEGORY? Tout cela est-il accompli dans un sproc, ou doit-il être séparé en plusieurs sprocs pour écrire les résultats sur une table?

Voici le code que j'ai écrit jusqu'à présent:

ALTER PROCEDURE [dbo].[spICCUMain] 
-- Add the parameters for the stored procedure here 

AS 
declare @columns varchar(8000) 

BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

-- Insert statements for procedure here 
SELECT @columns = COALESCE(@columns + ',[' + cast(UBCATEGORYmid as varchar) + ']','[' + cast(UBCATEGORYmid as varchar)+ ']') 
FROM vwICCUEnctrSelectedRevCatsDirCost 
GROUP BY UBCATEGORYmid 


DECLARE @query VARCHAR(8000) 

SET @query = ' 
SELECT * 
FROM vwICCUEnctrSelectedRevCatsDirCost 
PIVOT 
(
MAX(DirectCost) 
FOR [UBCATEGORYmid] 
IN (' + @columns + ') 
) 
AS p' 

EXECUTE(@query) 

END 

Cela fonctionne bien en ce qu'elle génère et compte tous les coûts directs pour chaque UBCATEGORY. Cependant, j'ai besoin de joindre en interne à vwICCUDAYS sur ACCOUNT pour ajouter une colonne au pivot pour ICCUDays. Les colonnes pivot finales doivent être Account, ICCUDays, Coût direct pour chaque UBCATEGORYmid. Je ne suis pas très familier avec la syntaxe coalesce et ne peux donc pas discerner comment la modifier pour ajouter d'autres colonnes, et je ne sais pas comment/où ajouter la syntaxe de jointure interne pour ajouter ICCUDays.

Quelqu'un peut-il me diriger dans la bonne direction? Merci, Sid

+0

Y a-t-il une raison particulière d'utiliser les vues comme base de la requête? –

Répondre

4

Vous devez connaître toutes les valeurs possibles de PIVOT par. Il est donc difficile de faire cela directement avec T-SQL à moins que vous n'utilisiez le SQL dynamique et cela peut devenir très rapide. Probablement mieux de renvoyer toutes les lignes au niveau présentation ou au rédacteur de rapport et de les laisser tourner de côté.

Voici un exemple rapide de PIVOT si vous connaissez toutes les valeurs de la catégorie UBC à l'avance. J'ai omis ICCUDays car il semble plutôt non pertinent à moins qu'il y ait des colonnes qui viennent de cette vue dans le cadre du résultat.

USE tempdb; 
GO 
SET NOCOUNT ON; 
GO 

-- who on earth is responsible for your naming scheme? 
CREATE TABLE dbo.ICCUEnctrSelectedRevCatsDirCost 
(
    Account INT, 
    UBCategory VARCHAR(10), 
    DirectCost DECIMAL(9,2) 
); 

INSERT dbo.ICCUEnctrSelectedRevCatsDirCost 
    SELECT 1, 'foo', 5.25 
    UNION SELECT 1, 'bar', 6.25 
    UNION SELECT 1, 'smudge', 8.50 
    UNION SELECT 2, 'foo', 9.25 
    UNION SELECT 2, 'brap', 2.75; 

SELECT Account,[foo],[bar],[smudge],[brap] FROM 
    dbo.ICCUEnctrSelectedRevCatsDirCost 
    -- WHERE <something>, I assume ??? 
PIVOT 
(
    MAX(DirectCost) 
    FOR UBCategory IN ([foo],[bar],[smudge],[brap]) 
) AS p; 

GO 
DROP TABLE dbo.ICCUEnctrSelectedRevCatsDirCost; 

Pour rendre plus dynamique, il faudrait obtenir la liste séparée par des virgules des valeurs Distinct UBCategory et construire le pivot à la volée. Ainsi, il pourrait ressembler à ceci:

USE tempdb; 
GO 
SET NOCOUNT ON; 
GO 

-- who on earth is responsible for your naming scheme? 
CREATE TABLE dbo.ICCUEnctrSelectedRevCatsDirCost 
(
    Account INT, 
    UBCategory VARCHAR(10), 
    DirectCost DECIMAL(9,2) 
); 

INSERT dbo.ICCUEnctrSelectedRevCatsDirCost 
    SELECT 1, 'foo', 5.25 
    UNION SELECT 1, 'bar', 6.25 
    UNION SELECT 1, 'smudge', 8.50 
    UNION SELECT 2, 'foo', 9.25 
    UNION SELECT 2, 'brap', 2.75 
    UNION SELECT 3, 'bingo', 4.00; 

DECLARE @sql NVARCHAR(MAX), 
    @col NVARCHAR(MAX); 

SELECT @col = COALESCE(@col, '') + QUOTENAME(UBCategory) + ',' 
    FROM 
    (
     SELECT DISTINCT UBCategory 
     FROM dbo.ICCUEnctrSelectedRevCatsDirCost 
    ) AS x; 

SET @col = LEFT(@col, LEN(@col)-1); 

SET @sql = N'SELECT Account, $col$ FROM 
    dbo.ICCUEnctrSelectedRevCatsDirCost 
    -- WHERE <something>, I assume ??? 
PIVOT 
(
    MAX(DirectCost) 
    FOR UBCategory IN ($col$) 
) AS p;'; 

SET @sql = REPLACE(@sql, '$col$', @col); 

--EXEC sp_executeSQL @sql; 
PRINT @sql; 

GO 
DROP TABLE dbo.ICCUEnctrSelectedRevCatsDirCost; 

ensuite sur « envoyer les données à une nouvelle table » vous pouvez juste faire la requête INTO ... SELECT INSERT au lieu d'un SELECT droit. Bien sûr, cela semble un peu inutile, car pour écrire cette instruction d'insertion, vous devez connaître l'ordre des colonnes (ce qui n'est pas garanti avec cette approche) et vous devez déjà avoir mis des colonnes pour chaque catégorie UBC potentielle. valeur de toute façon, donc cela semble très poulet et oeuf.

+0

Donc, vous suggéreriez de laisser SSRS 2005 faire le regroupement, le pivotement, etc.? Pourquoi est-ce conseillé d'utiliser Dynamic TSQL? Merci de m'avoir clarifié :) – SidC

+0

Eh bien, je ne suis pas sûr de comprendre comment vous allez "envoyer" des données à une autre table, si vous ne connaissez pas la forme du jeu de résultats.Si vous avez une catégorie UBC qui vous oblige à utiliser le SQL dynamique pour récupérer, comment est-il possible que la colonne de destination ait déjà défini cette colonne? La partie avant est nettement plus flexible en termes de traitement de ce type d'affichage. De toute façon pour un bon début sur les avantages et les inconvénients du SQL dynamique, s'il vous plaît voir: http://www.sommarskog.se/dynamic_sql.html –

+0

Merci beaucoup pour votre aide !! – SidC

Questions connexes