在SQL Server中,如何重命名基于另一列的NULL值的列中的值

问题描述

我想根据另一列中的NULL值重命名一个列中的单个值。我一直在考虑串联,但是我不知道它是否可行。

这是数据库代码

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],[PurchaseDate]) 
VALUES (6,N'iPhone 11',CAST(70000.00 AS Decimal(18,CAST(N'2020-02-07' AS Date));

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

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

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

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

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

INSERT [dbo].[Purchase_Items] ([ID],[PurchaseDate]) 
VALUES (16,N'BlackShark',CAST(N'2020-04-20' AS Date));

INSERT [dbo].[Purchase_Items] ([ID],[PurchaseDate]) 
VALUES (17,CAST(N'2020-04-22' AS Date));

INSERT [dbo].[Purchase_Items] ([ID],[PurchaseDate]) 
VALUES (18,CAST(N'2020-05-03' AS Date));

INSERT [dbo].[Purchase_Items] ([ID],[PurchaseDate]) 
VALUES (22,CAST(N'2020-05-21' AS Date));

INSERT [dbo].[Purchase_Items] ([ID],[PurchaseDate]) 
VALUES (23,N'BlackShark 3',CAST(N'2020-05-22' AS Date));

INSERT [dbo].[Purchase_Items] ([ID],[PurchaseDate]) 
VALUES (25,CAST(N'2020-05-10' AS Date));

这是我的SQL查询

SELECT 
    MONTH(PurchaseDate) Month,COALESCE(Brand,'Monthly Subtotal') 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       |  520000.00
        1        |     Monthly Subtotal    |  250000.00
        2        |     Monthly Subtotal    |  200000.00
        3        |     Monthly Subtotal    |   70000.00

但不是“小米总计”和“苹果总计” 我得到了“小米”和“苹果”

我该如何解决

解决方法

您需要在SQL中使用条件语句。这可以由CASE完成。但是,由于您有一个group by语句,因此最好在外部select语句中执行。 CONCAT()是SQL Server中用于连接两个字符串的函数。

SELECT 
   Month,CASE
      WHEN Month is Null THEN CONCAT('Grand Total for',Brand)
      ELSE Brand
   END AS newBrand,'Total Amount'
FROM(
   SELECT 
      MONTH(PurchaseDate) Month,COALESCE(Brand,'Monthly Subtotal') AS Brand,SUM(Price) AS 'Total Amount'
   FROM 
      Purchase_Items
   GROUP BY 
      CUBE(MONTH(PurchaseDate),Brand)
)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...