web-dev-qa-db-fra.com

Comment inclure la colonne de type BIT dans la partie SELECT sans l'inclure dans le GROUP BY dans T-SQL?

Voici ma requête T-SQL

SELECT 
    ProductID,
    VendorID,
    ProductName= MAX(ProductName),
    VendorName = MAX(VendorName),
    IsActive = MAX(IsActive) # This brings error 
FROM ProductVendorAssoc 
GROUP BY  
    ProductID,
    VendorID

Je souhaite appliquer GROUP BY Uniquement pour les champs ProductID and VendorID, Mais je dois remplir les champs ProductID, VendorID, ProductName, VendorName, IsActive.

Ici, j'ai utilisé la fonction agreggate MAX(ProductName) pour éviter ProductName dans le groupe par liste.

Mais la même astuce ne fonctionne pas pour les colonnes BIT car le bit de type de données d'opérande n'est pas valide pour l'opérateur max.

Comment puis-je inclure la colonne de type BIT dans la partie SELECT sans l'inclure dans le GROUP BY?

Mise à jour.

Que dois-je faire si j'ai besoin d'inclure une colonne INT comme UserID dans SELECT de la même manière

51

Mettez une expression CASE dedans, ou convertissez-la en int:

IsActive = MAX(CASE WHEN IsActive=1 THEN 1 ELSE 0 END)

ou,

IsActive = MAX(CONVERT(int,IsActive))

Vous devez également être conscient, évidemment, que cela signifie que les valeurs des colonnes ProductName, VendorName et IsActive dans le jeu de résultats peuvent toutes provenir de différentes lignes de la table de base.


Si vous voulez que ces trois colonnes soient en fait toutes de la même ligne (et en supposant que SQL Server 2005 ou version ultérieure), vous feriez quelque chose comme:

;With Numbered as (
    SELECT *,ROW_NUMBER() OVER (
        PARTITION BY ProductID,VendorID
        ORDER BY /* Something appropriate, or if we just want random... */ newid()) as rn
    FROM ProductVendorAssoc
)
select
    ProductID,
    VendorID,
    ProductName,
    VendorName,
    IsActive
FROM Numbered where rn=1
88

Un moyen plus court de le faire:

IsActive = MAX(0+IsActive)
10
Mike Keskinov

Dans SQL2005/2008, cela ressemblerait à ceci:

select ProductId, VendorId, ProductName, VendorName, IsActive
from
(
    select *, row_number() over (partition by ProductId, VendorId order by ProductId) RowNumber
    from Production.Product
) tt
where RowNumber = 1
3
Alex Aza