SQL Server查询-使用Order By Union对数据进行排序
这是示例数据,此表总结了一个租户在5年内和每月的销售额。此外,还计算了总销售额、每月和每天的平均销售额。为了能够做到这一点,我使用了4个sql查询来获取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
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日结束