gpt4 book ai didi

sql:行的值作为列

转载 作者:行者123 更新时间:2023-12-05 00:11:35 26 4
gpt4 key购买 nike

我有一张表,用于存储契约(Contract)的交易,如下所示:

Id_Contract[int] | Month[DateTime] | Amount[int]
------------------------------------------------
1 2012-01-01 00:00:00.000 500
1 2012-03-01 00:00:00.000 450
2 2012-09-01 00:00:00.000 300
3 2012-08-01 00:00:00.000 750

用户应该能够选择查询的时间跨度
我想要存档的是,如果用户选择 01/2012 - 03-2012 的时间跨度,他会得到结果:
Id_Contract[int] | Jan 2012 | Feb 2012 | Mar 2012
--------------------------------------------------
1 500 450

你对我如何解决这个问题有什么建议吗?

此致,
尝试

编辑:感谢到目前为止的答案!
当我用谷歌搜索我的问题时,我也偶然发现了旋转,但到目前为止我还没有找到一个真正解决我的问题的例子(因为基本上每个例子都给出了列条目的特定可能性,但在我的例子中它可以像 2012 年 3 月', '2012 年 4 月', ..., '2013 年 1 月', ...)

只是为了给你们一些关于我计划对我从 sql 查询获得的日期做些什么的更多背景信息:
我有一个带有 gridview 的 asp.net webforms 站点,其中包含一些关于契约(Contract)的数据......现在应该通过该特定契约(Contract)的付款信息来扩展该表(基本上是 Id_Contract 上的连接,但“旋转”)。
如果用户选择 2012 年 3 月 - 2012 年 5 月,则 Gridview 应包含契约(Contract)的正常数据 + 3 列付款信息(3 月、4 月、5 月)。
在 DB 中,只存储了已经插入值的条目。
-> 我希望解释能让事情更清楚一点。

最佳答案

您的问题可以使用动态旋转来解决。请看这个article

尝试这个

DECLARE @t TABLE(Id_Contract INT, Dt DATETIME,Amount INT)
INSERT INTO @t SELECT 1,'2012-01-01 00:00:00.000',500
INSERT INTO @t SELECT 1,'2012-03-01 00:00:00.000',450
INSERT INTO @t SELECT 2,'2012-09-01 00:00:00.000',300
INSERT INTO @t SELECT 3,'2012-08-01 00:00:00.000',750

DECLARE @cols AS VARCHAR(MAX), @query AS VARCHAR(MAX);

SELECT
Id_Contract
, LEFT(DATENAME(month,Dt),3) + ' ' + DATENAME(Year,Dt) AS Month_Year_Name
,Amount
INTO #Temp
FROM @t
WHERE Dt BETWEEN '01/01/2012' AND '03/31/2012'

SELECT @cols = STUFF(( SELECT DISTINCT
'],[' + t2.Month_Year_Name
FROM #Temp AS t2
ORDER BY '],[' + t2.Month_Year_Name
FOR XML PATH('')
), 1, 2, '') + ']'

SET @query = 'SELECT Id_Contract, ' + @cols + ' FROM
(
SELECT
Id_Contract
, Amount
, Month_Year_Name
FROM #Temp
) x
PIVOT
(
MAX(amount)
FOR Month_Year_Name in (' + @cols + ')
) p '
EXECUTE(@query)
DROP TABLE #Temp

//结果
Id_Contract Jan 2012    Mar 2012
1 500 450

编辑

对于您的测试数据,
DECLARE @t TABLE(Id_Contract INT, Dt DATETIME,Amount INT) 
INSERT INTO @t SELECT 1,'2012-01-01 00:00:00.000',500
INSERT INTO @t SELECT 1,'2012-03-01 00:00:00.000',450
INSERT INTO @t SELECT 2,'2012-03-01 00:00:00.000',450
INSERT INTO @t SELECT 3,'2012-08-01 00:00:00.000',750

输出是
Id_Contract Jan 2012    Mar 2012
1 500 450
2 NULL 450

让我知道它是否满足要求。

关于sql:行的值作为列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12279442/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com