SQL Server 查询 - 在 Union All 中使用 Order By 对数据进行排序

标签 sql sql-server sql-server-2008 sql-order-by

这是示例数据,此表汇总了一个租户在 5 年内每月的销售额。此外,还会计算总销售额、每月和每天的平均销售额。为了能够做到这一点,我使用了 4 个 sql 查询来获取

  1. 每月和每年的销售额,
  2. 总销售额,
  3. 每月平均销售额,以及
  4. 每天的平均销售额

然后,我使用 UNION ALL 方法产生这种输出:

enter image description here

这是代码的一部分

SELECT tenantcode, MONTH, year1, year2, year3, year4, year5
from #SalesPerYear 
UNION ALL
SELECT * FROM #TotalSales 
UNION ALL
SELECT * FROM #AveSalesMonth 
UNION ALL 
SELECT * FROM #AveSalesDay
ORDER BY TENANTCODE

每个临时表对应每个查询,得到上面提到的每个查询集。

但这只会在单个租户中产生输出,我想要的是通过选择多个租户来使其灵活,我能够做到,但排序并不令人满意。 期望的输出是这样的

enter image description here

但实际输出未实现。租户 1 的顺序没问题,但租户 2 乱七八糟。

这件事

enter image description here

我希望我解释得足够好。

最佳答案

您可以在所有查询中添加一个伪列来标识行的类型(每年、总计、月平均和日平均2)。然后按租户、行类型和月份编号对组合结果进行排序:

SELECT 1 AS [row type], tenantcode, [month], year1, year2, year3, year4, year5 FROM #SalesPerYear
UNION ALL
SELECT 2, #TotalSales.* FROM #TotalSales
UNION ALL
SELECT 3, #AveSalesMonth.* FROM #AveSalesMonth
UNION ALL
SELECT 4, #AveSalesDay.* FROM #AveSalesDay
ORDER BY tenantcode, [row type], [month]

您可以使用 DATEPART(MONTH, 'January 1, 2000') 将月份名称转换为数字,或者使用 DATENAME(MONTH, '2000-1-1') 将月份名称转换为名称

替代方案

由于结果应按以下顺序按月份列排序:JAUNARY、...、DECEMBER、TOTAL、AVE/MONTH、AVE/DAY。您可以简单地使用嵌套查询和冗长的 CASE 语句:

SELECT * FROM (
    SELECT tenantcode, [month], year1, year2, year3, year4, year5 FROM #SalesPerYear  UNION ALL
    SELECT * FROM #TotalSales    UNION ALL
    SELECT * FROM #AveSalesMonth UNION ALL 
    SELECT * FROM #AveSalesDay
) AS foobar
ORDER BY tenantcode, CASE [month] 
    WHEN 'JANUARY'   THEN 1
    WHEN 'FEBRUARY'  THEN 2
    WHEN 'MARCH'     THEN 3
    WHEN 'APRIL'     THEN 4
    WHEN 'MAY'       THEN 5
    WHEN 'JUNE'      THEN 6
    WHEN 'JULY'      THEN 7
    WHEN 'AUGUST'    THEN 8
    WHEN 'SEPTEMBER' THEN 9
    WHEN 'OCTOBER'   THEN 10
    WHEN 'NOVEMBER'  THEN 11
    WHEN 'DECEMBER'  THEN 12
END

有几种方法可以简化 case 语句,但我更愿意保持它的可读性。

关于SQL Server 查询 - 在 Union All 中使用 Order By 对数据进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33101033/

相关文章:

mysql - 单个 MySQL 表内的复杂比较和排除

php - 回显两个表的内容

SQL 执行返回的结果与直接在 MS SQL Server Management Studio 中执行不同

sql - 不允许保存更改。您所做的更改要求删除并重新创建以下表格

sql-server-2008 - 如何从PDF提取数据?

Mysql嵌套循环中最外层表可见性

SQL - AVG 和分组依据

asp.net - SQL Server 2008 架构更改的最佳实践

sql-server - 将 Prisma 连接到 Azure SQL 数据库

sql-server - SQL - 根据列查找公共(public)行(相交)