これが私のT-SQLクエリです
_SELECT
ProductID,
VendorID,
ProductName= MAX(ProductName),
VendorName = MAX(VendorName),
IsActive = MAX(IsActive) # This brings error
FROM ProductVendorAssoc
GROUP BY
ProductID,
VendorID
_
_GROUP BY
_フィールドにのみ_ProductID and VendorID
_を適用したいのですが、_ProductID, VendorID, ProductName, VendorName, IsActive
_フィールドに入力する必要があります。
ここでは、集約関数MAX(ProductName)
を使用して、group by listでProductName
を回避しました。
ただし、オペランドデータ型ビットがmax演算子に対して無効であるため、BIT
列に対して同じトリックは機能しません。
_GROUP BY
_に含めずにBIT
T部分にSELEC
タイプの列を含めるにはどうすればよいですか?
更新
同じようにINT
にUserID
のようなSELECT
列を含める必要がある場合はどうすればよいですか
そこにCASE式を入れるか、intに変換します:
IsActive = MAX(CASE WHEN IsActive=1 THEN 1 ELSE 0 END)
または、
IsActive = MAX(CONVERT(int,IsActive))
また、結果セットのProductName、VendorNameおよびIsActive列の値はすべて、ベーステーブルの異なる行から取得される可能性があることを意味することも明らかです。
これらの3つの列を実際にはすべて同じ行から取得する場合(およびSQL Server 2005以降を想定)、次のようにします。
;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
これを行うより短い方法:
IsActive = MAX(0+IsActive)
SQL2005/2008では、これは次のようになります。
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