问题描述
我想根据另一列中的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)
)