Sql 如何在Group By之后对列中的项目进行进一步分组
我有一个名为“DATA”的SQL表,如下所示:Sql 如何在Group By之后对列中的项目进行进一步分组,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个名为“DATA”的SQL表,如下所示: id plan mode cost. purchaseDate 1. cd3. ANNUALLY 34. 2020-05-04 2. fg45. QUARTERLY 456. 2021-01-02 plan. planCount. totalCostPerPlan cd3. 5 *not importan
id plan mode cost. purchaseDate
1. cd3. ANNUALLY 34. 2020-05-04
2. fg45. QUARTERLY 456. 2021-01-02
plan. planCount. totalCostPerPlan
cd3. 5 *not important*
cd3. 600 *not important*
cd3. 32 *not important*
fg45. 1 *not important*
fg45. 10 *not important*
h100. 7 *not important*
我试图返回以下3列:
计划,计划计数,总成本计划
我一直在处理一个查询以返回此结果,到目前为止,它看起来如下所示:
SELECT
plan,
COUNT(id) as planCount,
CASE
WHEN mode = 'ANNUALLY' THEN SUM(cost)
WHEN mode = 'S/ANNUALLY' THEN SUM(cost * 2)
WHEN mode = 'QUARTERLY' THEN SUM(cost * 3)
WHEN mode = 'MONTHLY' THEN SUM(cost * 12)
ELSE SUM(cost)
FROM DATA
WHERE purchaseDate >= *not important*
GROUP BY plan, mode
ORDER BY plan ASC
这是一种工作方式,但是,我得到的数据仅部分分组如下:
id plan mode cost. purchaseDate
1. cd3. ANNUALLY 34. 2020-05-04
2. fg45. QUARTERLY 456. 2021-01-02
plan. planCount. totalCostPerPlan
cd3. 5 *not important*
cd3. 600 *not important*
cd3. 32 *not important*
fg45. 1 *not important*
fg45. 10 *not important*
h100. 7 *not important*
(该表只是一个示例)
如何按计划进一步分组?我试图获得每个计划的总价值,但是,它们显示为每个模式的单独一行。请帮忙。嗯。如果要将因子放入
sum()
中,则案例
是sum()的参数
:
您可以选择交叉应用来计算每个计划模式的新成本。然后,你可以分组
DECLARE@table表(id int,pplan varchar(10),mode varchar(30),cost int,purchaseDate)
插入@table
价值观
(1、‘cd3’、‘每年’、34、‘2020-05-04’,
(2、‘fg45’、‘季刊’、‘456’、‘2021-01-02’,
(3,'cd3','MONTHLY',12,'2020-05-04'),
(4、‘fg45’、‘季度’、‘40’、‘2021-01-02’)
选择tt.pplan、tt.mode、count(tt.id)作为countofplan、sum(t.newcost)作为totalCost
从@table作为tt
交叉应用
(值(如为pplan,则为“每年”,然后为成本
当为“季度”时,则成本*3
如果是“每月”,则成本为*12
其他成本
结束)作为t(新成本)
按pplan分组,模式
pplan
模式
计划数
总成本
cd3
每年
1.
34
cd3
月刊
1.
12
fg45
每季的
2.
496
我使用了您的查询,并对其进行了一些修改以检索答案。在您的查询中,在case语句附近出现了一个错误,我通过添加end和column name alias纠正了这个错误。然后我删除了orderby,因为我想使用派生表中的结果进一步分组。您也可以使用temp table或CTE(公共表表达式)来检索数据。我添加的答案是使用派生表
DECLARE @table table(id int, [plan] varchar(10), mode varchar(30), cost int, purchaseDate date)
insert into @table
values
(1,'cd3' , 'ANNUALLY' , 34 , '2020-05-04'),
(2,'fg45', 'QUARTERLY', 456, '2021-01-02'),
(3,'cd3' , 'MONTHLY' , 12 , '2020-05-04'),
(4,'fg45', 'QUARTERLY', 40, '2021-01-02')
SELECT
A.[plan]
,SUM(A.[Cost]) AS [Cost]
FROM
(
SELECT
[plan],
COUNT(id) as planCount,
CASE
WHEN mode = 'ANNUALLY' THEN SUM(cost)
WHEN mode = 'S/ANNUALLY' THEN SUM(cost * 2)
WHEN mode = 'QUARTERLY' THEN SUM(cost * 3)
WHEN mode = 'MONTHLY' THEN SUM(cost * 12)
ELSE SUM(cost) END As [Cost]
FROM @table
WHERE purchaseDate >= '2020-05-04'
GROUP BY [plan], mode
) AS A
GROUP BY A.[plan]
您的最终结果如下:您可以使用表更改查询。
提示:您可以使用一个而不是搜索的
案例
:案例模式,当“年度”时,然后是总和(成本);当“年度”时,然后是总和(成本*2)。。。else Sum(Cost)end
。非常有效,谢谢@遗传学1989。如果这回答了你的问题,你可以接受答案。