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 SELEC
T 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
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
Un moyen plus court de le faire:
IsActive = MAX(0+IsActive)
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