2012-02-09 5 views
1

J'ai une table de base de données, 'Rapports'. Chaque colonne de cette table est de type bit. Donc, si la valeur 1 (c'est-à-dire vrai), le rapport est requis.Renvoyer tous les cas 'Vrai' du tableau

J'ai une procédure stockée qui est utilisée pour remplir une table temporaire avec TOUS les rapports marqués comme vrai.

Quelle est la meilleure façon de faire cela? Mon instruction CASE renvoie uniquement la première valeur TRUE, lorsque ce que je veux, c'est tous les cas où le rapport est TRUE.

Merci!

DECLARE @RequiredReports as table 
(
    Report nvarchar(150) 
) 
INSERT INTO @RequiredReports 
(
    Report 
) 
SELECT 
    CASE 
     WHEN r.ReportCountry = 1 THEN 'Country Report' 
     WHEN r.ReportPerson = 1 THEN 'Person Report' 
     WHEN r.ReportProfession = 1 THEN 'Profession Report' 
     WHEN r.ReportAge = 1 THEN 'Age Report' 
    END 
FROM dbo.Reports r 
+1

veuillez décrire votre tableau de rapports. – vulkanino

+0

Que voulez-vous vraiment ajouter dans cette table? Seul le type de rapport? –

+0

utilisateur nvarchar (250)

ReportCountry bit ReportPerson bit

ReportProfession bit bit de reportage
K09

Répondre

5

Vous pouvez utiliser croisée se présente comme suit:

select T.Name 
from dbo.Reports as R 
    cross apply (select R.ReportCountry, 'Country Report' union all 
       select R.ReportPerson, 'Person Report' union all 
       select R.ReportProfession, 'Profession Report' union all 
       select R.ReportAge, 'Age Report') as T(Active, Name) 
where T.Active = 1 

http://data.stackexchange.com/stackoverflow/query/61227/unpivot-reports

Dans SQL Server 2008 et vous pouvez ensuite utiliser values au lieu de union all.

select T.Name 
from dbo.Reports as R 
    cross apply (values (R.ReportCountry, 'Country Report'), 
         (R.ReportPerson, 'Person Report'), 
         (R.ReportProfession, 'Profession Report'), 
         (R.ReportAge, 'Age Report')) as T(Active, Name) 
where T.Active = 1 
2

Vous pouvez essayer d'utiliser UNPIVOT:

declare @Reports table (
[User] nvarchar(250) not null, 
ReportCountry bit not null, 
ReportPerson bit not null, 
ReportProfession bit not null, 
ReportAge bit not null 
) 
insert into @Reports ([User],ReportCountry,ReportPerson,ReportProfession,ReportAge) 
select 'Damien',1,0,1,0 

select 
    * 
from 
    @Reports unpivot (RunReport for ReportName in (ReportCountry,ReportPerson,ReportProfession,ReportAge)) r 

Le résultat est:

User RunReport ReportName 
Damien 1 ReportCountry 
Damien 0 ReportPerson 
Damien 1 ReportProfession 
Damien 0 ReportAge 

Et vous pouvez le traiter comme une source de table normale pour plus interrogation/filtrage.

Questions connexes