【问题标题】:Change the string value in a column based on another column that is the same row with it根据与它同一行的另一列更改列中的字符串值
【发布时间】:2020-10-28 05:21:13
【问题描述】:

我想更改一列中的值的名称,该名称将基于具有同一行的另一列中的值。

我正在使用 GROUP BY 运算符,使用 CUBE 关键字。

这是我用来创建表格的代码:

CREATE TABLE [dbo].[Purchase_Items]
(
    [ID] [int] NULL,
    [Model_Name] [varchar](50) NULL,
    [Brand] [varchar](50) NULL,
    [Price] [decimal](18, 2) NULL,
    [PurchaseDate] [date] NULL
);

INSERT [dbo].[Purchase_Items] ([ID], [Model_Name], [Brand], [Price], 
[PurchaseDate]) 
VALUES (5, N'iPhone X', N'Apple', CAST(50000.00 AS Decimal(18, 2)), 
CAST(N'2020-02-03' AS Date));

INSERT [dbo].[Purchase_Items] ([ID], [Model_Name], [Brand], [Price], 
[PurchaseDate]) 
VALUES (6, N'iPhone 11', N'Apple', CAST(70000.00 AS Decimal(18, 2)), 
CAST(N'2020-02-07' AS Date));

INSERT [dbo].[Purchase_Items] ([ID], [Model_Name], [Brand], [Price], 
[PurchaseDate]) 
VALUES (7, N'iPhone 6s', N'Apple', CAST(20000.00 AS Decimal(18, 2)), 
CAST(N'2020-02-10' AS Date));

INSERT [dbo].[Purchase_Items] ([ID], [Model_Name], [Brand], [Price], 
[PurchaseDate]) 
VALUES (8, N'iPhone 8', N'Apple', CAST(30000.00 AS Decimal(18, 2)), 
CAST(N'2020-02-21' AS Date));

INSERT [dbo].[Purchase_Items] ([ID], [Model_Name], [Brand], [Price], 
[PurchaseDate]) 
VALUES (13, N'Redmi 9', N'Xiaomi', CAST(10000.00 AS Decimal(18, 2)), 
CAST(N'2020-03-21' AS Date));

INSERT [dbo].[Purchase_Items] ([ID], [Model_Name], [Brand], [Price], 
[PurchaseDate]) 
VALUES (14, N'Redmi K30', N'Xiaomi', CAST(25000.00 AS Decimal(18, 2)), 
CAST(N'2020-04-03' AS Date));

INSERT [dbo].[Purchase_Items] ([ID], [Model_Name], [Brand], [Price], 
[PurchaseDate]) 
VALUES (15, N'Mi Note 10', N'Xiaomi', CAST(15000.00 AS Decimal(18, 2)), 
CAST(N'2020-04-21' AS Date));

INSERT [dbo].[Purchase_Items] ([ID], [Model_Name], [Brand], [Price], 
[PurchaseDate]) 
VALUES (16, N'BlackShark', N'Xiaomi', CAST(30000.00 AS Decimal(18, 2)), 
CAST(N'2020-04-20' AS Date));

INSERT [dbo].[Purchase_Items] ([ID], [Model_Name], [Brand], [Price], 
[PurchaseDate]) 
VALUES (17, N'iPhone 11', N'Apple', CAST(70000.00 AS Decimal(18, 2)), 
CAST(N'2020-04-22' AS Date));

INSERT [dbo].[Purchase_Items] ([ID], [Model_Name], [Brand], [Price], 
[PurchaseDate]) 
VALUES (18, N'iPhone 11', N'Apple', CAST(70000.00 AS Decimal(18, 2)), 
CAST(N'2020-05-03' AS Date));

INSERT [dbo].[Purchase_Items] ([ID], [Model_Name], [Brand], [Price], 
[PurchaseDate]) 
VALUES (22, N'iPhone 8', N'Apple', CAST(30000.00 AS Decimal(18, 2)), 
CAST(N'2020-05-21' AS Date));

INSERT [dbo].[Purchase_Items] ([ID], [Model_Name], [Brand], [Price], 
[PurchaseDate]) 
VALUES (23, N'BlackShark 3', N'Xiaomi', CAST(30000.00 AS Decimal(18, 2)), 
CAST(N'2020-05-22' AS Date));

INSERT [dbo].[Purchase_Items] ([ID], [Model_Name], [Brand], [Price], 
[PurchaseDate]) 
VALUES (25, N'iPhone X', N'Apple', CAST(70000.00 AS Decimal(18, 2)), 
CAST(N'2020-05-10' AS Date));

这是我的查询:

SELECT month(PurchaseDate) Month,
   CASE WHEN month(PurchaseDate) is null then CONCAT('Grand Total for ', Brand) 
          ELSE COALESCE(Brand, 'Monthly Subtotal') end AS Brand,
   SUM(Price) as 'Total Amount'
FROM Purchase_Items
GROUP BY CUBE(month(PurchaseDate), Brand)

这是输出:

Purchase Month   |         Brand           | Total Amount
---------------------------------------------------------
        3        |         Xiaomi          |   10000.00 
        4        |         Xiaomi          |   70000.00
        5        |         Xiaomi          |   30000.00
       NULL      |  Grand Total for Xiaomi |  110000.00
        2        |         Apple           |  170000.00
        4        |         Apple           |   70000.00
        5        |         Apple           |  170000.00
       NULL      |  Grand Total for Apple  |  410000.00           
       NULL      |    Grand Total for      |  520000.00
        1        |     Monthly Subtotal    |  250000.00
        2        |     Monthly Subtotal    |  200000.00
        3        |     Monthly Subtotal    |   70000.00

我想将“总计”更改为“总计”,但我不知道如何。

我在考虑是否可以根据“总金额”列中的最高数字来更改它,因为它们共享同一行,但也许还有其他方法可以解决这个问题。

我该如何解决这个问题?

【问题讨论】:

  • 请区分 MySQL (Oracle) 和 MS SQL (Microsoft) aka SQL Server。主题和标签列表已编辑。

标签: sql-server group-by case-when coalesce


【解决方案1】:

测试类似的东西

CASE WHEN month(PurchaseDate) IS NULL AND Brand IS NULL THEN 'Grand Total'
     WHEN month(PurchaseDate) IS NULL                   THEN CONCAT('Grand Total for ', Brand) 
                                                        ELSE COALESCE(Brand, 'Monthly Subtotal') 
     END AS Brand,

在第一种情况下 - 也许WHEN Brand IS NULL 就足够了吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-05
    • 1970-01-01
    • 2022-07-29
    相关资源
    最近更新 更多