SQL Server查询 - 使用联合全部排序依据排序数据

时间:2015-10-13 11:04:53

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

以下是样本数据,此表汇总了一个租户在5年和每月的销售情况。此外,还计算总销售额,每月平均销售额和每日销售额。为了能够做到这一点,我使用了4个sql查询来获取

  1. 每月和每年的销售额,
  2. 总销售额,
  3. 每月平均销售额和
  4. 每日平均销售额
  5. 然后,我使用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
    

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

    但这仅仅在SINGLE TENANT中产生输出,我想要的是通过使其成为多租户选择来使其变得灵活,我能够做到但是顺序并不令人满意。 所需的输出是这样的

    enter image description here

    但实际输出未达成。 Tenant1的订购还可以,但是租户2是隆隆的。

    这件事

    enter image description here

    我希望我解释得很好。

2 个答案:

答案 0 :(得分:4)

您可以在标识行类型的所有查询中添加虚假列(每年,总计,月平均值和每日平均值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语句,但我宁愿让它保持可读性。

答案 1 :(得分:0)

你能试试吗

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
)t  
ORDER BY TENANTCODE