将具有相似值和总和值的相同列和表中的行组合在一起

时间:2015-12-01 06:12:03

标签: sql

我的数据集非常大(如下所示):

#ID  #report_name           #report_count 
1     ReportA1              3
2     ReportA1(PDF)         4
3     ReportA2              2
4     ReportA2(PDF)         6
5     ReportA3              7
6     ReportA3(PDF)         2
7     ReportA4              9   
8     ReportA4(PDF)         7
9     ReportA5              1
10    ReportA5(PDF)         2
11    ReportA6              8
12    ReportA6(PDF)         9
13    ReportA7              8
14    ReportA7(PDF)         6
15    ReportA8              6
16    ReportA8(PDF)         7
17    ReportA9              5
18    ReportA9(PDF)         9
19    ReportA10             7
20    ReportA10(PDF)        1

我想进行 SQL查询,以便将两行合并为单行

例如ReportA1和ReportA1(PDF)作为ReportA1。

我的问题,如何创建SQL语句来组合两行数据(即ReportA1和ReportA1(PDF)) 并将其统计为单个名称(即ReportA1),如下表所示(仅限示例)?

#ID  #report_name   #report_count       
1   ReportA1        7
2   ReportA2        8
3   ReportA3        9
4   ReportA4        16
5   ReportA5        3
6   ReportA6        17
7   ReportA7        14
8   ReportA8        13
9   ReportA9        14
10  ReportA10       8

5 个答案:

答案 0 :(得分:2)

在mySQL中你可能会这样做:

SELECT ReportName, SUM(ReportCount) as ReportsCount 
FROM (
  SELECT REPLACE(ReportName,'(PDF)','') as ReportName, ReportCount
  FROM Reports ) T
GROUP BY ReportName

参见 Demo

答案 1 :(得分:0)

这应该可以帮到你

select substr(report_name,8),sum(report_count) from yourtablename
groupb by (substr(report_name,8))

这是Oracle语法,但每个SQL dialekt都有一个" substr"梅索德。

答案 2 :(得分:0)

我认为report_name字段总是因两行中的“(pdf)”字而不同。如果是这种情况,那么您可以尝试以下方法:

select ROW_NUMBER() OVER(Order by replace(report_name, '(pdf)', '')) as ID, 
replace(report_name, '(pdf)', '') as report_name, sum(report_count) as report_count
FRom @temp
Group by replace(report_name, '(pdf)', '')

答案 3 :(得分:0)

可以帮助您的示例:

SELECT
    report_name,
    report_count
FROM
(
    SELECT REPLACE(report_name, '(PDF)') AS report_name, SUM(report_count) AS report_count FROM
    (
        SELECT 'RPT A1(PDF)' AS report_name, 4 AS report_count FROM DUAL
         UNION
        SELECT 'RPT A1' AS report_name, 3 AS report_count FROM DUAL
         UNION
        SELECT 'RPT A2(PDF)' AS report_name, 12 AS report_count FROM DUAL
         UNION
        SELECT 'RPT A2' AS report_name, 5 AS report_count FROM DUAL
         UNION
        SELECT 'RPT A3(PDF)' AS report_name, 8 AS report_count FROM DUAL
         UNION
        SELECT 'RPT A3' AS report_name, 2 AS report_count FROM DUAL
    )
    GROUP BY REPLACE(report_name, '(PDF)')
)
ORDER BY report_name

此示例输出为:

RPT A1  7
RPT A2  17
RPT A3  10

<强>要点:

使用按GROUP BY REPLACE(report_name, '(PDF)')分组将从report_name列和组中删除{strong>(PDF)一词REPLACE函数的结果

答案 4 :(得分:0)

在Sql Server中:

SELECT RName AS 'report_name', SUM(report_count) AS 'report_count'
FROM(
    SELECT REPLACE(report_name,'(PDF)','') AS 'RName' 
           ,report_count 
    FROM dbo.test)
GROUP BY [RName]

这应该有效