在SQL

时间:2017-03-06 06:21:44

标签: sql sql-server

我有以下SQL语句:

SELECT
    row1 AS row1str,
    SUM(row2),
    SUM(row3),
    SUM(row4)
FROM
    table1
GROUP BY
    row1
UNION
SELECT
    'Total',
    SUM(row2),
    SUM(row3),
    SUM(row4),
FROM
    table1
ORDER BY
    CASE row1 WHEN 'Total' THEN 1 ELSE 0 END, row1;

返回每行中唯一值的总和,包括另一行,其中包含每列值的总和。我添加了一个ORDER BY子句,因为row1包含以字母“u”开头的单词。

现在的问题是我无法将“总计”行移到底部我的结果因为运行查询会给我这个错误:

  

如果语句,ORDER BY项必须出现在选择列表中   包含UNION,INTERSECT或EXCEPT运算符。

这对我来说很有意义,因为我的第二个SELECT语句不包含row1(我不确定我对这个错误的理解是否100%正确)。但是,将ORDER BY子句移动到第一个SELECT语句肯定会返回错误:

  

关键字“UNION”附近的语法不正确。

我也试过给row1一个别名并尝试引用它,但没有成功。

所以我的问题是,如何将包含值'Total'的行移动到我的SQL查询结果的底部?

2 个答案:

答案 0 :(得分:0)

Use Temp table,First insert sum values and finally insert total.

 CREATE TABLE #table1(row1 INT,row2 INT,row3 INT,row4 INT)

 INSERT INTO #table1(row1 ,row2 ,row3 ,row4)
 SELECT row1 AS row1str,SUM(row2),SUM(row3),SUM(row4)
 FROM table1
 GROUP BY row1

 INSERT INTO #table1(row1 ,row2 ,row3 ,row4)
 SELECT 'Total',SUM(row2),SUM(row3),SUM(row4),
 FROM table1

 SELECT * FROM #table1 

答案 1 :(得分:0)

您可以尝试以下内容并查看。

SELECT *
FROM
  (SELECT row1 AS row1str,
    SUM(row2),
    SUM(row3),
    SUM(row4)
  FROM table1
  GROUP BY row1
  UNION
  SELECT 'Total',
  SUM(row2),
  SUM(row3),
  SUM(row4)
  FROM table1
  )
ORDER BY row1str DESC;