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

SQL Server查询-使用Order By Union对数据进行排序,sql,sql-server,sql-server-2008,sql-order-by,Sql,Sql Server,Sql Server 2008,Sql Order By,这是示例数据,此表总结了一个租户在5年内和每月的销售额。此外,还计算了总销售额、每月和每天的平均销售额。为了能够做到这一点,我使用了4个sql查询来获取 每月和每年的销售额 总销售额 每月平均销售额,以及 每日平均销售额 然后,我使用UNION ALL方法生成这种输出: 这是代码的一部分 SELECT tenantcode, MONTH, year1, year2, year3, year4, year5 from #SalesPerYear UNION ALL SELECT * FROM

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

  • 每月和每年的销售额
  • 总销售额
  • 每月平均销售额,以及
  • 每日平均销售额
  • 然后,我使用UNION ALL方法生成这种输出:

    这是代码的一部分

    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
    
    每个临时表对应于每个查询,以获得上面提到的每个查询集

    但是这只在一个租户中产生一个输出,我想要的是通过多租户选择使其灵活,我能够做到这一点,但排序不令人满意所需的输出如下所示

    但实际输出未达到。租户1的订购是正常的,但是租户2发出隆隆声。

    有什么事吗


    我希望我解释得足够好。

    您可以在所有查询中添加一个假列来标识行的类型(每年、总计、每月平均值和每日平均值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(2000年1月1日的月份)
    将月份名称转换为数字,或使用
    DATENAME(2000年1月1日的月份)
    将月份编号转换为名称

    替代溶液 由于结果应按以下顺序按月份列排序:年月日、…、十二月、总计、平均/月、平均/日。您可以简单地使用嵌套查询和冗长的
    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
    

    有两种方法可以简化案例陈述,但我更愿意让它保持可读性。

    您可以在识别行类型的所有查询中添加一个假列(每年、总计、每月平均值和每日平均值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(2000年1月1日的月份)
    将月份名称转换为数字,或使用
    DATENAME(2000年1月1日的月份)
    将月份编号转换为名称

    替代溶液 由于结果应按以下顺序按月份列排序:年月日、…、十二月、总计、平均/月、平均/日。您可以简单地使用嵌套查询和冗长的
    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
    

    有两种方法可以简化案例陈述,但我宁愿让它可读。

    你能试试这个吗

    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
    

    你能试试这个吗

    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
    


    我需要输入rowtype?根据#salleryear的查询集,Month不是数字。它实际上是基于月份名称,代码是这样按日期排序的(MM,datename(month,date)+'01 2011')月份名称的顺序不正确,先生。。。正如您所说的,因为在我当前的代码中,它不在数字中。您需要2个“helper列”,一个用于此处建议的“rowtype”,另一个用于正确排序月份;没有两者,你根本不会成功。请注意,标题为“月”的列中也包含非日期信息(例如“总计”),这就是为什么我建议使用另一个帮助器列的原因。这是错误:如果语句包含UNION、INTERSECT或EXCEPT运算符,则ORDER BY items必须出现在select列表中。我需要输入rowtype?月不是基于#SALEARYEAR查询集的数字。它实际上是基于月份名称,代码是这样按日期排序的(MM,datename(month,date)+'01 2011')月份名称的顺序不正确,先生。。。正如您所说的,因为在我当前的代码中,它不在数字中。您需要2个“helper列”,一个用于此处建议的“rowtype”,另一个用于正确排序月份;没有两者,你根本不会成功。请注意,标题为“月”的列中还包含非日期信息(例如“总计”),这就是为什么我建议使用另一个帮助器列的原因。这是错误:如果语句包含UNION,则ORDER BY items必须出现在select列表中,INTERSECT或EXCEPT运算符。您应该查看分组集的
    而不是当前的方法:这在sql server 2008中可行吗?我链接了2008手册:-)您应该查看分组集的
    而不是当前的方法:这在sql server 2008中可行吗?我链接了2008手册:-)哦。。。另外,我在ORDERBY子句中只添加了一列,如果想在更多列上下单,最后一行应该是ORDERBY TENTCODE,MOUNT。虽然按月份排序将按字母顺序排序。若要保持月份的精确顺序,您可能需要使用case语句在内部查询中为月份指定一些数字值,然后在外部查询中对该数字进行排序。若要向月份添加序列,您可以使用如下方式进行用户查询:选择tenantcode,案例月份当“1月”时,然后是“2月”时,然后是“3月”时,然后是“4月”时,然后是“5月”时,然后是“6月”时,然后是“7月”时,然后是“8月”时,然后是“9月”时,然后是“10月”时,然后是“11月”时,然后是“12月”,最后是“mn”,第1年,第2年,第3年,第4年,第5年从#销售人员根据租户代码订购,mnOh。。。另外,我在ORDERBY子句中只添加了一列,如果想在更多列上下单,最后一行应该是ORDERBY TENTCODE,MOUNT。虽然按月份排序将按字母顺序排序。若要保持月份的精确顺序,您可能需要使用case语句在内部查询中为月份指定一些数字值,然后在外部查询中对该数字进行排序。若要向月份添加序列,您可以使用如下方式进行用户查询:选择tenantcode,案例月份:1月1日2月2日3月4日5月6日7月8日9月10日11月12日结束