0 0

一个SQL 分组统计的SQL语句,困住了,看看怎么实现3

原始表数据结构
名称 数量 单价 总金额
根1 500 500 250000
子1 100 500 50000
子2 100 500 50000
子3 100 500 50000
子4 100 500 50000
子5 100 500 50000
根2 300 50 15000
根2_子1 100 50 5000
根2_子2 100 50 5000
根2_子3 100 50 5000
根3 0 0 0

查询后得到以下结果:
名称 数量 单价 总金额
根1 500 500 250000
子1 100 500 50000
子2 100 500 50000
子3 100 500 50000
子4 100 500 50000
合计 500 2500 250000
根2 300 50 15000
根2_子1 100 50 5000
根2_子2 100 50 5000
根2_子3 100 50 5000
合计 300 150 15000
根3 0 0 0

这里主要是,根和子是父子关系,表里面有个 PID ,统计时只要统计子的合计

问题补充:
hudingchen 写道
你数据是不是有问题,我理解原表数据应该

根1	500	500	250000
根1_子1	100	500	50000
根1_子2	100	500	50000
根1_子3	100	500	50000
根1_子4	100	500	50000
根1_子5	100	500	50000
根2	300	50	15000
根2_子1	100	50	5000
根2_子2	100	50	5000
根2_子3	100	50	5000
根3	0  	0	0


是的,就是这样

问题补充:
hudingchen 写道
SELECT CASE WHEN RIGHT(m.rootName, 1) = '_' 
            THEN '合计' 
            ELSE m.rootName END 
       rootName, 
       m.amount, 
       m.price, 
       m.total_amount
  FROM (SELECT SUBSTRING(t.root_name, 1, CHARINDEX('_', t.root_name)) AS rootName,
               SUM(amount) amount,
               SUM(price) price,
               SUM(total_amount) total_amount
          FROM hudc.dbo.test t
         WHERE CHARINDEX('_', t.root_name) > 0
         GROUP BY SUBSTRING(t.root_name, 1, CHARINDEX('_', t.root_name))
        UNION ALL
        SELECT t2.* FROM hudc.dbo.test t2) m
 ORDER BY CASE WHEN RIGHT(m.rootName, 1) = '_' 
               THEN m.rootName + '子子' 
               ELSE m.rootName END

首先谢谢你的回答,
我现在的问题是,父跟子的关系是通过pid来控制的,跟root_name没有关系的,就没有‘_’ 这种规则在,我把SQL 贴给你看看,
CREATE TABLE [dbo].[test] (
[id] [int] NULL ,
[text] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[pid] [int] NULL ,
[size] [int] NULL ,
[price] [float] NULL ,
[totalPrice] [float] NULL
) ON [PRIMARY]
GO

insert test(id,text,pid,size,price,totalPrice) values( 1 , '根1' , 0 , 50 , 500.0 , 25000.0 )
insert test(id,text,pid,size,price,totalPrice) values( 2 , '子11' , 1 , 10 , 500.0 , 5000.0 )
insert test(id,text,pid,size,price,totalPrice) values( 3 , '子12' , 1 , 30 , 500.0 , 15000.0 )
insert test(id,text,pid,size,price,totalPrice) values( 4 , '子13' , 1 , 10 , 500.0 , 5000.0 )
insert test(id,text,pid,size,price,totalPrice) values( 5 , '根2' , 0 , 60 , 400.0 , 24000.0 )
insert test(id,text,pid,size,price,totalPrice) values( 6 , '子21' , 5 , 15 , 400.0 , 6000.0 )
insert test(id,text,pid,size,price,totalPrice) values( 7 , '子22' , 5 , 25 , 400.0 , 10000.0 )
insert test(id,text,pid,size,price,totalPrice) values( 8 , '子23' , 5 , 20 , 400.0 , 8000.0 )
2011年5月30日 16:25

4个答案 按时间排序 按投票排序

0 0

采纳的答案

你这个属于层次查询了,如果父子关系就是两层的话,可以这么写

SELECT m.*
  FROM (SELECT 'x' id,
               '合计' text,
               t1.pid,
               SUM(t1.size) size,
               SUM(t1.price) price,
               SUM(t1.totalPrice) totalPrice
          FROM hudc.dbo.test2 t1
         WHERE t1.pid > 0
         GROUP BY t1.pid
        UNION ALL
        SELECT CAST(t2.id AS VARCHAR),
               t2.text,
               t2.pid,
               t2.size,
               t2.price,
               t2.totalPrice
          FROM hudc.dbo.test2 t2) m
 ORDER BY CASE
            WHEN CAST(m.pid AS VARCHAR) = '0' THEN
             CAST(m.id AS VARCHAR)
            ELSE
             CAST(m.pid AS VARCHAR) + '_' + CAST(m.id AS VARCHAR)
          END

如果层数不固定的话,在sql 2000下不好实现,sql 2005提供了层次查询函数。

2011年5月31日 20:32
0 0

SELECT CASE WHEN RIGHT(m.rootName, 1) = '_' 
            THEN '合计' 
            ELSE m.rootName END 
       rootName, 
       m.amount, 
       m.price, 
       m.total_amount
  FROM (SELECT SUBSTRING(t.root_name, 1, CHARINDEX('_', t.root_name)) AS rootName,
               SUM(amount) amount,
               SUM(price) price,
               SUM(total_amount) total_amount
          FROM hudc.dbo.test t
         WHERE CHARINDEX('_', t.root_name) > 0
         GROUP BY SUBSTRING(t.root_name, 1, CHARINDEX('_', t.root_name))
        UNION ALL
        SELECT t2.* FROM hudc.dbo.test t2) m
 ORDER BY CASE WHEN RIGHT(m.rootName, 1) = '_' 
               THEN m.rootName + '子子' 
               ELSE m.rootName END

2011年5月30日 23:26
0 0

你数据是不是有问题,我理解原表数据应该

根1	500	500	250000
根1_子1	100	500	50000
根1_子2	100	500	50000
根1_子3	100	500	50000
根1_子4	100	500	50000
根1_子5	100	500	50000
根2	300	50	15000
根2_子1	100	50	5000
根2_子2	100	50	5000
根2_子3	100	50	5000
根3	0  	0	0

2011年5月30日 17:15
0 0

你把创建表结构贴上

2011年5月30日 16:48

相关推荐

    sql注入语句sql注入语句sql注入语句

    sql注入语句sql注入语句sql注入语句sql注入语句sql注入语句sql注入语句sql注入语句sql注入语句sql注入语句sql注入语句sql注入语句sql注入语句sql注入语句sql注入语句sql注入语句sql注入语句sql注入语句sql注入语句...

    Oracle Sql语句转换成Mysql Sql语句

    当需要将一个基于Oracle SQL的应用程序迁移到MySQL环境时,就需要进行SQL语句的转换工作。本项目提供了一个Java源码工具,能够帮助用户便捷地将Oracle SQL语句转换为MySQL SQL语句。 Oracle SQL与MySQL SQL的主要...

    pb通过sql语句实现分组小计统计

    在本文中,我们将深入探讨如何使用SQL语句实现分组小计统计,这是一个常见的需求,尤其是在数据分析、报表生成和业务洞察领域。我们将基于提供的部分代码示例,详细解释其背后的逻辑和技术要点。 ### SQL实现分组小...

    sql语句说明sql语句说明sql语句说明.zip

    sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明sql语句说明...

    sql语句万能生成器,sql语句,sql语句生成

    在压缩包文件"sql_ok"中,可能包含了这样一个工具的安装程序或使用教程,可以帮助你开始探索和利用SQL语句生成器的便利性。 总之,SQL语句生成器是数据库开发者的得力助手,它能简化SQL编写,提高代码质量,降低...

    一个简单的sql循环语句脚本

    本话题将详细讲解一个简单的SQL循环语句脚本及其相关知识。 一、SQL循环语句概述 SQL循环语句主要包括WHILE循环和FOR循环,它们允许我们在满足特定条件时重复执行一段代码块。在PL/SQL和T-SQL中,还有BEGIN-END...

    SQLTracker,抓取sql语句的工具

    总之,SQLTracker作为一个强大的SQL监控工具,对于数据库管理和优化工作具有重要作用。通过深入理解和有效利用SQLTracker,我们可以更有效地管理和维护数据库系统,确保其高效、稳定地运行。同时,它也有助于提升...

    SQL语句实现跨Sql server数据库操作实例

    接下来,我们再看一个更复杂的例子,即如何将一个SQL Server实例中的数据插入到另一个SQL Server实例的表中。假设需要将192.168.1.2的SQL Server实例(数据库名为TT)中表test2的数据插入到192.168.1.1的SQL Server...

    XML查询语句转换成SQL语句的实现.pdf

    XML 查询语句转换成 SQL 语句的实现 本文主要讨论将 XML 查询语句转换成 SQL 语句的实现。XML 已经成为 Internet 上数据交换的事实标准,特别是在 Web 数据挖掘技术中,对数据源的结构化需求导致人们对 XML 文档的...

    泛微系统SQL语句大全

    利用SQL的`WHERE`子句进行条件筛选,`GROUP BY`进行分组统计,`HAVING`过滤分组结果,配合`CASE`表达式实现复杂的逻辑判断,满足多样化的业务需求。 5. **SQL Server特性**: - SQL Server提供了许多高级特性,如...

    非常好用的SQL Server 抓取SQL语句工具HOOK

    非常好用的SQL Server 抓取SQL语句工具HOOK 非常好用的SQL Server 抓取SQL语句工具HOOK 非常好用的SQL Server 抓取SQL语句工具HOOK 非常好用的SQL Server 抓取SQL语句工具HOOK

    SQL语句测试SQL语句测试SQL语句测试

    例如,一个SELECT语句应返回正确的行数和内容;INSERT、UPDATE和DELETE语句应影响正确的行。 3. **异常处理**:测试语句在面对边缘条件或异常情况时的行为,如空值处理、超出范围的索引或无效的数据类型。 4. **...

    SQL基本语句SQL基本语句

    SQL基本语句SQL基本语句SQL基本语句SQL基本语句SQL基本语句SQL基本语句SQL基本语句SQL基本语句SQL基本语句

    sqlserver 分组合并 分组统计

    sqlserver 分组合并字符串 分组统计数量

    SQL sever 2000各种查询语句和建表语句

    4. **分组查询**:使用GROUP BY子句将结果按一个或多个列进行分组。例如: ```sql SELECT ColumnName1, COUNT(*) FROM TableName GROUP BY ColumnName1; ``` 这将返回每种ColumnName1的行数。 5. **聚合函数**...

    浅谈SQL Server中Select语句的分组统计功能.pdf

    Group by子句是Select语句中实现分组统计的重要组件,它能够根据一个或多个列的值将数据行进行分组,并且配合聚合函数,如COUNT(), SUM(), AVG(), MIN(), MAX()等,可以对每个分组进行统计汇总操作。 首先,分组...

    Java打印漂亮的SQL语句(被格式化的SQL语句)

    "标签"进一步强调了这个工具的关键特性,包括"Java输出漂亮的SQL语句",这意味着它是一个Java环境下的解决方案,能够集成到Java项目中,通过Java代码来调用和实现SQL语句的格式化。另一个标签"SQL格式化"则明确了它...

    hibernate执行原生sql语句

    Hibernate 提供了多种方式来执行原生 SQL 语句,其中之一是使用 `Session.createSQLQuery()` 方法,该方法返回一个 `SQLQuery` 对象,该对象提供了执行原生 SQL 语句的方法。 例如,我们可以使用以下代码来执行一个...

    SQL语句SQL语句.zip

    在这个名为“SQL语句SQL语句.zip”的压缩包中,包含了一个名为“SQL语句.sql”的文件,很可能是包含了一系列SQL查询和其他数据库操作的脚本。 SQL主要分为以下几个部分: 1. 数据查询(DQL):这是SQL最基础的功能...

Global site tag (gtag.js) - Google Analytics