【问题标题】:Order by Month and Year in a merge query在合并查询中按月和年排序
【发布时间】:2023-03-08 04:32:01
【问题描述】:

这是我的查询

    SELECT DateName
    ,SubTotal
    ,Discount
    ,TotalAmount
    ,Investment
    ,(CASE WHEN Expense.expense IS NULL THEN 0 ELSE Expense.expense END) + (CASE WHEN MonthlyExpense.Expense IS NULL THEN 0 ELSE Monthlyexpense.Expense END) Expense
    ,Profit - ((CASE WHEN Expense.expense IS NULL THEN 0 ELSE Expense.expense END) + (CASE WHEN MonthlyExpense.Expense IS NULL THEN 0 ELSE Monthlyexpense.Expense END)) AS NetProfit
    ,TotalAmount - ((CASE WHEN Expense.expense IS NULL THEN 0 ELSE Expense.expense END) + (CASE WHEN MonthlyExpense.Expense IS NULL THEN 0 ELSE Monthlyexpense.Expense END)) AS NetCash
FROM (
    SELECT datepart(month, SaleDate) Month
        ,datename(year, SaleDate) Year
        ,datename(month, SaleDate) + '-' + datename(year, SaleDate) AS DateName
        ,SUM(SubTotal) SubTotal
        ,SUM(Discount) AS Discount
        ,SUM(TotalAmount) AS TotalAmount
        ,SUM(Investment) AS Investment
        ,SUM(Profit) AS Profit
    FROM (
        SELECT TOP 100 PERCENT NS.SaleID
            ,SaleDate
            ,Max(NS.SubTotal) AS SubTotal
            ,Max(NS.Discount) AS Discount
            ,Max(NS.TotalAmount) AS TotalAmount
            ,SUM(NSD.Investment) AS Investment
            ,SUM(NSD.Profit) - Max(NS.Discount) AS Profit
        FROM [Sales] NS
        INNER JOIN [SalesDetail] NSD ON NS.SaleID = NSD.SaleID
        WHERE NS.SaleDate >= '01-06-2015 08:45:59 PM'
            AND NS.SaleDate < '01-06-2015 12:00:00 AM'
        GROUP BY NS.SaleID
            ,SaleDate
        ORDER BY DatePart(month, SaleDate)
        ) T
    GROUP BY datename(year, SaleDate)
        ,datepart(month, SaleDate)
        ,datename(month, SaleDate) + '-' + datename(year, SaleDate)
    ) Revenue
LEFT JOIN (
    SELECT datepart(month, ExpenseDate) Month
        ,datename(year, ExpenseDate) Year
        ,SUM(Amount) AS Expense
    FROM DailyExpenses
    WHERE ExpenseDate >= '01-06-2015 08:45:59 PM'
        AND ExpenseDate < '01-06-2015 12:00:00 AM'
    GROUP BY datepart(month, ExpenseDate)
        ,datename(year, ExpenseDate)
    ) Expense ON Expense.Month = Revenue.Month
    AND Expense.Year = Revenue.Year
LEFT JOIN (
    SELECT Month
        ,[Year]
        ,SUM(Amount) AS Expense
    FROM MonthlyExpenses
    WHERE ExpenseDate >= '01-06-2015 08:45:59 PM'
        AND ExpenseDate < '01-06-2015 12:00:00 AM'
    GROUP BY Month
        ,[Year]
    ) MonthlyExpense ON MonthlyExpense.Month = Revenue.Month
    AND MonthlyExpense.Year = Revenue.Year

这里月份和年份是合并的。 Here is the output which i have. 不知道在哪里下订单。我想按月-年顺序获得结果。

January-2015
February-2015
March-2015
----
---
---
February-2018
March-2018
April-2018

【问题讨论】:

  • 您应该可以在查询末尾添加ORDER BY Month, Year
  • 由于月份和年份列未列出是选择查询,因此不允许。
  • 您知道TOP 100 PERCENT 有效地告诉SQL Server 它可以忽略关联的ORDER BY。子查询不能被排序,并且你写的任何声称这样做的东西都没有。

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


【解决方案1】:
Select DateName
    ,SubTotal
    ,Discount
    ,TotalAmount
    ,Investment
    ,NetCash
    from(
SELECT Year
    ,Month
    ,DateName
    ,SubTotal
    ,Discount
    ,TotalAmount
    ,Investment
    ,(CASE WHEN ... END)) AS NetCash
FROM (
    ...
    ) Revenue
LEFT JOIN (
    ...
    ) Expense ON Expense.Month = Revenue.Month
    AND Expense.Year = Revenue.Year
LEFT JOIN (
    ...
    ) MonthlyExpense ON MonthlyExpense.Month = Revenue.Month
    AND MonthlyExpense.Year = Revenue.Year
    ) sql1 
    order by Year, Month

【讨论】:

  • Revenue 后有左连接。似乎语法错误,如果我放在前面) 收入。它没有帮助。相同的输出
  • 已更新...如果最后一个代码不起作用,则将整个查询放在 select 中,然后按顺序执行
【解决方案2】:

在下面的选择中添加额外的列,并在下面添加查询顺序,

SELECT DateName,
     CAST(('01-'+DateName) as Date) as dateOrderCol
    ,SubTotal
    ,Discount
    ,TotalAmount
    ,
    ......
    order by dateOrderCol asc

【讨论】:

    【解决方案3】:

    只需通过Revenue.Month, Revenue.Month下订单

    SELECT DateName
                ,SubTotal
                ,Discount
                ,TotalAmount
                ,Investment
                ,(CASE WHEN Expense.expense IS NULL THEN 0 ELSE Expense.expense END) + (CASE WHEN MonthlyExpense.Expense IS NULL THEN 0 ELSE Monthlyexpense.Expense END) Expense
                ,Profit - ((CASE WHEN Expense.expense IS NULL THEN 0 ELSE Expense.expense END) + (CASE WHEN MonthlyExpense.Expense IS NULL THEN 0 ELSE Monthlyexpense.Expense END)) AS NetProfit
                ,TotalAmount - ((CASE WHEN Expense.expense IS NULL THEN 0 ELSE Expense.expense END) + (CASE WHEN MonthlyExpense.Expense IS NULL THEN 0 ELSE Monthlyexpense.Expense END)) AS NetCash
            FROM (
                SELECT datepart(month, SaleDate) Month
                    ,datename(year, SaleDate) Year
                    ,datename(month, SaleDate) + '-' + datename(year, SaleDate) AS DateName
                    ,SUM(SubTotal) SubTotal
                    ,SUM(Discount) AS Discount
                    ,SUM(TotalAmount) AS TotalAmount
                    ,SUM(Investment) AS Investment
                    ,SUM(Profit) AS Profit
                FROM (
                    SELECT TOP 100 PERCENT NS.SaleID
                        ,SaleDate
                        ,Max(NS.SubTotal) AS SubTotal
                        ,Max(NS.Discount) AS Discount
                        ,Max(NS.TotalAmount) AS TotalAmount
                        ,SUM(NSD.Investment) AS Investment
                        ,SUM(NSD.Profit) - Max(NS.Discount) AS Profit
                    FROM [Sales] NS
                    INNER JOIN [SalesDetail] NSD ON NS.SaleID = NSD.SaleID
                    WHERE NS.SaleDate >= '01-06-2015 08:45:59 PM'
                        AND NS.SaleDate < '01-06-2015 12:00:00 AM'
                    GROUP BY NS.SaleID
                        ,SaleDate
                    ORDER BY DatePart(month, SaleDate)
                    ) T
                GROUP BY datename(year, SaleDate)
                    ,datepart(month, SaleDate)
                    ,datename(month, SaleDate) + '-' + datename(year, SaleDate)
                ) Revenue
            LEFT JOIN (
                SELECT datepart(month, ExpenseDate) Month
                    ,datename(year, ExpenseDate) Year
                    ,SUM(Amount) AS Expense
                FROM DailyExpenses
                WHERE ExpenseDate >= '01-06-2015 08:45:59 PM'
                    AND ExpenseDate < '01-06-2015 12:00:00 AM'
                GROUP BY datepart(month, ExpenseDate)
                    ,datename(year, ExpenseDate)
                ) Expense ON Expense.Month = Revenue.Month
                AND Expense.Year = Revenue.Year
            LEFT JOIN (
                SELECT Month
                    ,[Year]
                    ,SUM(Amount) AS Expense
                FROM MonthlyExpenses
                WHERE ExpenseDate >= '01-06-2015 08:45:59 PM'
                    AND ExpenseDate < '01-06-2015 12:00:00 AM'
                GROUP BY Month
                    ,[Year]
                ) MonthlyExpense ON MonthlyExpense.Month = Revenue.Month
                AND MonthlyExpense.Year = Revenue.Year
                                                                                                                                                            where ProductCode=SP.ProductCode  and PackageCode=SP.PackageCode and FranchiseID=39802),0) > 0
            order by Revenue.Month, Revenue.Month
    

    【讨论】:

    • 我认为您的意思是 Revenue.Year, Revenue.Month
    • @Paresh 是的,我在收入中找到了年份和月份
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2017-04-03
    • 2018-06-01
    • 2016-04-16
    • 2013-02-12
    • 2015-12-17
    • 1970-01-01
    相关资源
    最近更新 更多