我希望这很清楚 - 我需要使用T-Sql在表格中创建记录,使用从不同表格中获取的唯一列表,在2012年之后为每个年份和季度插入一条记录,并使用另一个自定义值(风险) )也附上。
换句话说,我有一个NAME列表(取自SELECT DISTINCT语句),例如10个值。对于这10个名称中的每一个,我需要在具有以下内容的单独表中插入一行:
从确定的起始年份(2012年)到当年的每个名称,年份,季度和风险组合的名称,年份,季度,风险1-2。
所以,如果我从SELECT DISTINCT语句返回这些名称:
BOB, MARY
我希望将其插入表格中:
BOB, 2012, Q1, Risk1
BOB, 2012, Q1, RISK2
BOB, 2012, Q2, Risk1
BOB, 2012, Q2, Risk2
BOB, 2012, Q1, Risk1
BOB, 2012, Q2, Risk2
......(一直到今年)
MARY, 2012, Q1, Risk1
MARY, 2012, Q1, RISK2
MARY, 2012, Q2, Risk1
MARY, 2012, Q2, Risk2
MARY, 2012, Q1, Risk1
....(并且在名称列表完成之前一直打开。)
我确信有一种优雅的方法可以做到这一点,但我只是没有SQL chops来解决这个问题。
答案 0 :(得分:2)
我会给你一些细节,因为我只是在回家的路上。
您需要为每个值选择不同的选项,然后交叉加入所有人。
如果您没有要进行选择的表格,请使用CTE
生成这些值。
WITH names as (
SELECT DISTINCT name
FROM YourTable
), years as (
SELECT 2012 as year UNION ALL
SELECT 2013 as year UNION ALL
SELECT 2014 as year UNION ALL
SELECT 2015 as year UNION ALL
SELECT 2016 as year
), quarters as (
SELECT 'Q1' as year UNION ALL
SELECT 'Q2' as year UNION ALL
SELECT 'Q3' as year UNION ALL
SELECT 'Q4' as year
), risks as (
SELECT 'Risk1' as risk UNION ALL
SELECT 'Risk2' as risk
)
SELECT N.NAME, Y.year, Q.quarter, R.risk
FROM names N
CROSS JOIN years Y
CROSS JOIN quarters Q
CROSS JOIN risks R
ORDER BY N.NAME, Y.year, Q.quarter, R.risk
修改强>
对于年份列表,您可能需要使用递归CTE更通用的内容,例如
with yearlist as
(
select 2004 as year
union all
select yl.year + 1 as year
from yearlist yl
where yl.year + 1 <= YEAR(GetDate())
)
select year
from yearlist
order by year desc;