Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何在Group By之后对列中的项目进行进一步分组_Sql_Sql Server_Tsql - Fatal编程技术网

Sql 如何在Group By之后对列中的项目进行进一步分组

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

我有一个名为“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 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。如果这回答了你的问题,你可以接受答案。