J'ai une table qui ressemble à ceci:

CREATE TABLE [dbo].[Phrase] 
(
    [PhraseId]     UNIQUEIDENTIFIER DEFAULT (newid()) NOT NULL,
    [English]      NVARCHAR (250)   NOT NULL,
    [p1]           BIT              DEFAULT ((0)) NOT NULL,
    [p2]           BIT              DEFAULT ((0)) NOT NULL,
    [p3]           BIT              DEFAULT ((0)) NOT NULL, 

    PRIMARY KEY CLUSTERED ([PhraseId] ASC),

    CONSTRAINT [FK_PhrasePhraseChapter] 
        FOREIGN KEY ([ChapterId]) 
        REFERENCES [dbo].[PhraseChapter] ([PhraseChapterShortId])
);

Ce que je voudrais faire, c'est obtenir un nombre de p1, p2 et p3 pour que la sortie ressemble à quelque chose comme:

p1  100
p2  200
p3  23

Notez que dans ce cas, la première ligne signifierait qu'il y avait 100 lignes dans la table Phrase pour lesquelles p1 avait la valeur 1. J'espère que cela a du sens.

Je sais que je pourrais le faire simplement avec trois colonnes, mais j'ai besoin d'une sortie de ligne de seulement deux colonnes de chaîne comme ci-dessus. Quelqu'un peut-il me donner une suggestion sur la façon dont je pourrais y parvenir?

1
user1464139 27 janv. 2017 à 12:12

3 réponses

Meilleure réponse

Vous pouvez utiliser UNPIVOT, comme ceci:

SELECT  myColumn ,
        NoOfTrue
FROM    ( SELECT    [p1] = COUNT(CASE WHEN [p1] = 1 THEN 1 END) ,
                    [p2] = COUNT(CASE WHEN [p2] = 1 THEN 1 END) ,
                    [p3] = COUNT(CASE WHEN [p3] = 1 THEN 1 END)
          FROM      Phrase
        ) d UNPIVOT
    ( NoOfTrue FOR myColumn IN ( [p1], [p2], [p3] ) ) piv;
1
Tanner 27 janv. 2017 à 10:05

Peut-être en utilisant cas et somme:

SELECT sum(case when p1 = 1 then 1 end) as p1Count, 
       sum(case when p2 = 1 then 1 end) as p2Count,
       sum(case when p3 = 1 then 1 end) as p3Count
FROM Phrase
0
Svekke 27 janv. 2017 à 09:23

Le moyen le plus simple est:

select 'p1' p, sum(p1) countp
from Phrase
union all
select 'p2', sum(p2)
from Phrase
union all
select 'p3', sum(p3)
from Phrase;

Notez que l'utilisation de sum pour un champ bit peut faire tout ce que vous voulez.
Un champ bit peut avoir des valeurs (0 - 1 - null) et sum ajoutera des valeurs null comme 0;

0
shA.t 27 janv. 2017 à 09:24