私はグループ名の列と費やされる列の列を持っています。 グループ名に基づいて金額グループを合計し、最高5を取得する必要があります。その後、残りの部分をそれ自身のグループにまとめて、合計金額を費やす必要があります。これは今私が持っているものです上位5行を取得して残りのSQL Serverを結合
これらのグループは、それらを注文しますが、私はそれらを組み合わせるために残りのグループをつかむ方法を知りません。どんな助けもありがとう。
私はグループ名の列と費やされる列の列を持っています。 グループ名に基づいて金額グループを合計し、最高5を取得する必要があります。その後、残りの部分をそれ自身のグループにまとめて、合計金額を費やす必要があります。これは今私が持っているものです上位5行を取得して残りのSQL Serverを結合
これらのグループは、それらを注文しますが、私はそれらを組み合わせるために残りのグループをつかむ方法を知りません。どんな助けもありがとう。
私が正しくあなたを理解していた場合、これはそれを行う必要があります:ROW_NUMBER()(SQL Serverを2005+)を使用して
SELECT top 5 groupName, SUM(amount) AS theAmountSpent
into #tempSpent FROM purchases
GROUP BY groupName
ORDER BY theAmountSpent DESC
Select * from #tempSpent -- get the top 5
--get sum for the rest
SELECT SUM(amount) AS theAmountSpent
FROM purchases
where groupName not in (select groupName from #tempSpent)
Drop table #tempSpent
代替CTE-アプローチ:
WITH cte AS (
SELECT ROW_NUMBER() OVER (ORDER BY (SUM(amount)) DESC) AS num,
groupName, SUM(amount) AS theAmountSpent
FROM purchases
GROUP BY groupName
)
SELECT groupName, theAmountSpent FROM cte WHERE num BETWEEN 1 AND 5 --top 5
UNION ALL
SELECT 'Sum rest', SUM(theAmountSpent) FROM cte WHERE num > 5 -- sum of rest
もう一つのアイデアLarstsからコード:
WITH cte
AS
(
SELECT case
when ROW_NUMBER() OVER (ORDER BY (SUM(amount)) DESC) <=5
then ROW_NUMBER() OVER (ORDER BY (SUM(amount)) DESC)
else 6 end AS num
, groupName
, SUM(amount) AS theAmountSpent
FROM purchases
GROUP BY groupName
)
SELECT num
, max(groupName)
, sum(theAmountSpent)
FROM cte
group by num
これは確かに良いアプローチです – Colin