簡體   English   中英

以“總計”作為最后一列的SQL語句

[英]SQL Statement With 'Totals' as Final Column

我正在嘗試運行SQL查詢,第一列為“ month”。 每列將有一個數字值(或月份數),最后一列將顯示“總計”。 問題是,當我嘗試按順序排列它們時,每次到達“總計”列都會給我錯誤,因為它正在尋找INT值。 因此,例如,我有以下查詢:

SELECT CY.Month, CY.PaymentAmount_ThisYear, LY.PaymentAmount_LastYear FROM
(SELECT DATEPART(MM, Orders.OrderDate) AS Month, SUM(Orders.PaymentAmount) as PaymentAmount_ThisYear 
    FROM Orders WHERE DATEPART(YY, Orders.OrderDate) = DATEPART(YY, DATEADD(MM, -1, CURRENT_TIMESTAMP))
    GROUP BY DATEPART(MM, Orders.OrderDate)
) CY
INNER JOIN 
(SELECT DATEPART(MM, Orders.OrderDate) AS Month, SUM(Orders.PaymentAmount) as PaymentAmount_LastYear
    FROM Orders WHERE DATEPART(YY, Orders.OrderDate) = DATEPART(YY, DATEADD(MM, -13, CURRENT_TIMESTAMP))
    GROUP BY DATEPART(MM, Orders.OrderDate)
) LY
ON CY.Month = LY.Month
UNION
SELECT 'Totals' AS Month, CY.PaymentAmount_ThisYear, LY.PaymentAmount_LastYear FROM
(SELECT SUM(Orders.PaymentAmount) AS PaymentAmount_ThisYear
    FROM Orders WHERE DATEPART(YY, Orders.OrderDate) = DATEPART(YY, DATEADD(MM, -1, CURRENT_TIMESTAMP))
) CY,
(SELECT SUM(Orders.PaymentAmount) AS PaymentAmount_LastYear
    FROM Orders WHERE DATEPART(YY, Orders.OrderDate) = DATEPART(YY, DATEADD(MM, -13, CURRENT_TIMESTAMP))
) LY

如果將“總計”更改為13,它將起作用並將總計放在底部,但該行顯示“ 13”而不是“總計”。

在此處輸入圖片說明

因此,我嘗試的是在查詢的一開始就改變了這一點:

SELECT CY.Month

SELECT CAST(CY.Month AS VARCHAR(10)) AS Month

但是當我這樣做時,命令他們犯錯了:

1
10
11
5

因為它將它們識別為varchar值。 我基本上是在尋找按數字排序月份的方法,但是最后一欄是“總計”。

我也試着做一個

1則CAST(月份)(按國際標准月份)其他月份結束時,按個案編號(月)

但這給了我一個“模棱兩可的列名” Month”。 錯誤。

我有點困惑,有什么想法嗎? 謝謝!

我認為您可以大大簡化查詢並使用GROUP BY的ROLLUP選項進行總計,例如:

SELECT 
      CASE 
        WHEN GROUPING(MONTH(orders.orderdate)) = 1 
        THEN 'Totals' 
        ELSE CONVERT(CHAR(2), MONTH(orders.orderdate)) 
      END AS [Month]
    , SUM(
        CASE 
            WHEN YEAR(orders.orderdate) = Datepart(yy, Dateadd(mm, -1, CURRENT_TIMESTAMP)) 
            THEN orders.paymentamount 
            ELSE 0.00
        END
        )   AS PaymentAmount_ThisYear 
    , SUM(
        CASE 
            WHEN YEAR(orders.orderdate) = Datepart(yy, Dateadd(mm, -13, CURRENT_TIMESTAMP)) 
            THEN orders.paymentamount 
            ELSE 0.00 
        END
        )   AS PaymentAmount_LastYear 
FROM   
    orders 
GROUP BY   
    MONTH(orders.orderdate)
WITH ROLLUP

您可以嘗試將當前查詢放入嵌入式視圖中,然后再排序

SELECT Month, PaymentAmount_ThisYear, PaymentAmount_LastYear
FROM (
    SELECT CAST(CY.Month AS VARCHAR(10)) AS Month, CY.PaymentAmount_ThisYear, LY.PaymentAmount_LastYear FROM
        (SELECT DATEPART(MM, Orders.OrderDate) AS Month, SUM(Orders.PaymentAmount) as PaymentAmount_ThisYear 
            FROM Orders WHERE DATEPART(YY, Orders.OrderDate) = DATEPART(YY, DATEADD(MM, -1, CURRENT_TIMESTAMP))
            GROUP BY DATEPART(MM, Orders.OrderDate)
        ) CY
    INNER JOIN 
        (SELECT DATEPART(MM, Orders.OrderDate) AS Month, SUM(Orders.PaymentAmount) as PaymentAmount_LastYear
            FROM Orders WHERE DATEPART(YY, Orders.OrderDate) = DATEPART(YY, DATEADD(MM, -13, CURRENT_TIMESTAMP))
            GROUP BY DATEPART(MM, Orders.OrderDate)
        ) LY
    ON CY.Month = LY.Month
    UNION
    SELECT 'Totals' AS Month, CY.PaymentAmount_ThisYear, LY.PaymentAmount_LastYear FROM
        (SELECT SUM(Orders.PaymentAmount) AS PaymentAmount_ThisYear
            FROM Orders WHERE DATEPART(YY, Orders.OrderDate) = DATEPART(YY, DATEADD(MM, -1, CURRENT_TIMESTAMP))
        ) CY,
        (SELECT SUM(Orders.PaymentAmount) AS PaymentAmount_LastYear
            FROM Orders WHERE DATEPART(YY, Orders.OrderDate) = DATEPART(YY, DATEADD(MM, -13, CURRENT_TIMESTAMP))
        ) LY) T
ORDER BY CASE WHEN ISNUMERIC(Month) = 1 THEN 0 ELSE 1 END, Month

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM