sql - 列数取决于变量
问题描述
我有一个带有数据的 sql 表
日期 | 票号 | 成本 |
---|---|---|
01.08.2021 | ui1234 | 15 |
我需要输出
出票日期、10 美元之前的票数、20 美元之前的票数、30 美元之前的票数等。
列数可能因变量中的指定值而异
例如,如果您在变量 500 中指定成本,那么将有 50 列,渐变不会改变
解决方案
您可以使用动态 SQL 执行此操作。我将展示一种使用 SQL Server 的技术,但您可以适应另一个 RDBMS。这是存储过程的绝佳候选者,但我将向您展示一个脚本。我将创建一个临时表并用示例数据填充它。那时,我们将构建一个动态 SQL 查询,然后当它准备好时,我们可以让 SQL Server 为我们执行它。在这个脚本中我是 SQL 语句,所以你可以看到它,如果提供的不大于零SELECT
,我会显示一个错误。@Cost
DROP TABLE IF EXISTS #Tickets;
CREATE TABLE #Tickets(
[date] DATE NOT NULL,
[ticket_id] VARCHAR(10) NOT NULL,
[cost] DECIMAL(5,2) NOT NULL
);
INSERT INTO #Tickets([date],[ticket_id],[cost])
VALUES ('8-1-2021','ui123', 15.00), ('8-1-2021','ui456', 25.00);
-- this is the parameter you would accept - the maximum cost for the columns
DECLARE @Cost DECIMAL(5,2);
SELECT @Cost = 50.00;
DECLARE @Sql NVARCHAR(max);
SELECT @Sql = N'SELECT ';
-- we will step by 10 until we reach the @Cost
DECLARE @Step INT;
SELECT @Step = 10;
IF (@Cost <= 0)
BEGIN
SELECT 'Cost must be positive';
RETURN;
END
WHILE (@Step <= @Cost)
BEGIN
IF @Step > 10 SELECT @Sql = CONCAT(@Sql, N', ');
SELECT @Sql = CONCAT(@Sql, N' COUNT(CASE WHEN cost BETWEEN ', @Step - 10, N' AND ', @Step, N' THEN 1 ELSE NULL END) AS [', @Step, N']');
SELECT @Step = @Step + 10;
END
SELECT @Sql = CONCAT(@Sql, N' FROM #Tickets');
-- show the statement
SELECT @Sql;
-- run the statement
EXECUTE sp_executesql @Sql;
推荐阅读
- powershell - 保存到与给定路径同名但扩展名不同的文件
- python - Python SpeechRecognition 没有响应
- sql - RFC2822 日期时间格式到 SQL 服务器中可用的日期时间
- powershell - PowerShell:如何计算 CRLF,但不包括 LF
- amazon-web-services - 如何使用 terraform 启动 Beanstalk 环境,HealthChecks 为“EC2 和 ELB”,health_check_grace_time 为 1500?
- android - 我正面临这个问题,BC 提供商不再提供 Signature.SHA256WithRSAEncryption 的实现
- embedded-linux - 在运行 PetaLinux 的 zedboard 上打开 LED 时出现问题
- sockets - UDP 数据报在套接字中存储多长时间?
- node.js - Pub/Sub Lite GRPC - 错误:14 不可用:502:网关错误
- c# - 如何在 NPOI - Docx 中添加与默认页脚不同的首页页脚?