SQL分组依据和基于其他列中不同值的求和(如果其他列中的值重复,则求和一次)

SQL分组依据和基于其他列中不同值的求和(如果其他列中的值重复,则求和一次),sql,group-by,sum,teradata,distinct,Sql,Group By,Sum,Teradata,Distinct,我需要一组查询的帮助。我的桌子看起来像这样: +--------+---------------------+------------------------+ | PERSON | ITEM_DISTINCT_COUNT | COST_DISTINCT_ITEM_SUM | +--------+---------------------+------------------------+ | A | 2 |

我需要一组查询的帮助。我的桌子看起来像这样:

+--------+---------------------+------------------------+
| PERSON | ITEM_DISTINCT_COUNT | COST_DISTINCT_ITEM_SUM |
+--------+---------------------+------------------------+
| A      |                   2 |                      6 |
| B      |                   2 |                     10 |
| C      |                   1 |                      1 |
+--------+---------------------+------------------------+
创建多集表MY_表PERSON CHAR1,ITEM CHAR1,COST INT; 在MY_表中插入值'A','1',5; 在MY_表中插入值'A','1',5; 在MY_表中插入值'A','2',1; 在MY_表中插入值“B”、“3”、0; 在MY_表中插入值'B','4',10; 在MY_表中插入值'B','4',10; 在MY_表中插入值'C','5',1; 在MY_表中插入值'C','5',1; 在MY_表中插入值'C','5',1; 我需要按个人对项目和成本进行分组,但方式不同。对于每个人,我需要他们拥有的独特物品的数量。例:人A有两个不同的项目,项目1和项目2。我可以用COUNTDISTINCT项目得到这个

然后,对于每个人,我需要计算成本的总和,但对于重复的项目,每个不同的项目只需计算一次,成本总是相同的。例:A个人的物品1售价5美元,物品1售价5美元,物品2售价1美元。因为这个人有两次第1项,我数了5美元一次,然后从第2项中加上1美元,总共6美元。输出应如下所示:

+--------+---------------------+------------------------+
| PERSON | ITEM_DISTINCT_COUNT | COST_DISTINCT_ITEM_SUM |
+--------+---------------------+------------------------+
| A      |                   2 |                      6 |
| B      |                   2 |                     10 |
| C      |                   1 |                      1 |
+--------+---------------------+------------------------+
有没有一种简单的方法可以在很多行上都表现良好

选人 ,COUNTDISTINCT ITEM ITEM\u DISTINCT\u COUNT -有助于了解成本_独特_项目_金额 从我的桌子上 分组
我建议采用两级聚合:

select person, count(*) as num_items, sum(cost)
from (select person, item, avg(cost) as cost
      from my_table t
      group by person, item
     ) t
group by person;

我建议采用两级聚合:

select person, count(*) as num_items, sum(cost)
from (select person, item, avg(cost) as cost
      from my_table t
      group by person, item
     ) t
group by person;

您可以创建一个子查询,获取每个人的项目和成本的不同值,然后在此基础上进行聚合:

SELECT PERSON, 
       COUNT(ITEM) AS ITEM_DISTINCT_COUNT,
       SUM(COST) AS COST_DISTINCT_ITEM_SUM 
FROM (
  SELECT DISTINCT PERSON, ITEM, COST
  FROM MY_TABLE
) M
GROUP BY PERSON
输出:

PERSON  ITEM_DISTINCT_COUNT     COST_DISTINCT_ITEM_SUM
A       2                       6
B       2                       10
C       1                       1

您可以创建一个子查询,获取每个人的项目和成本的不同值,然后在此基础上进行聚合:

SELECT PERSON, 
       COUNT(ITEM) AS ITEM_DISTINCT_COUNT,
       SUM(COST) AS COST_DISTINCT_ITEM_SUM 
FROM (
  SELECT DISTINCT PERSON, ITEM, COST
  FROM MY_TABLE
) M
GROUP BY PERSON
输出:

PERSON  ITEM_DISTINCT_COUNT     COST_DISTINCT_ITEM_SUM
A       2                       6
B       2                       10
C       1                       1

Gordon,有没有一种简单的方法可以在不编写sql查询的情况下为此类帖子创建表?我想要一个类似电子表格的工具,它可以让您输入数据并将其转换为SQL以创建表。这样,我就可以少打字了。@ErranMorad。您拥有的insert语句对其他语句最有用—好吧,实际的SQL或DB FIDLE会更有用。@erromorad两者都有,并且有文本到DDL工具,可以实现您想要的功能。Gordon,有没有一种简单的方法可以在不编写SQL查询的情况下为此类帖子创建表?我想要一个类似电子表格的工具,它可以让您输入数据并将其转换为SQL以创建表。这样,我就可以少打字了。@ErranMorad。您拥有的insert语句对其他语句最有用-好吧,实际的SQL或DB FIDLE会更有用一点。@ERMANORAD两者都有,并且有文本到DDL工具可以实现您想要的功能。您的目标系统真的是Teradata吗?TD不支持这种多值语法。@dnoeth它是Teradata。我更新了那段代码,谢谢。你的目标系统真的是Teradata吗?TD不支持这种多值语法。@dnoeth它是Teradata。我更新了那段代码,谢谢。