输入:
身份证 | 代码 | 描述 | 七月 | 八月 |
---|---|---|---|---|
1 | 1000 | 进项税 | 空 | 空 |
2 | 1 | 越谷 | 65755 | 48910 |
3 | 2 | 宿舍 | 15994 | 25107 |
4 | 0 | 商业 | 23873 | 23813 |
5 | 空 | 总计 | 105622 | 97830 |
6 | 2014 | 渲染帐户 | 空 | 空 |
7 | 1 | 世界花园 | 65755 | 48910 |
8 | 0 | 商业 | 23873 | 23813 |
9 | 空 | 总计 | 89628 | 72723 |
输出:
代码 | 描述 | 财产 | 七月 | 八月 |
---|---|---|---|---|
1000 | 进项税 | 越谷 | 65755 | 48910 |
1000 | 进项税 | 宿舍 | 15994 | 25107 |
2014 | 渲染帐户 | 世界花园 | 65755 | 48910 |
在 SQL Server 中,我有像上面提到的这样的输入。
我想要一个如上所示的输出结果。
如果有一个代码是 0 那么我们必须忽略这一行并且描述是 Total 那么我们也必须忽略这一行。
假设代码的数字大于三个,则描述与输出中给出的相同。但需要添加额外的列,即属性,属性名称是从描述的下一行获取的,但我们必须指定一个条件,其中代码介于 1 到 2、1 到 3、1 到 4 等之间。
这是使用窗口函数
first_value() over()
和 sum() over()
的一种选择
注意:这假设
CODE
是 string
而不是 INT
示例
with cte as (
Select NCode = first_value(Code) over (Partition by Grp Order by ID)
,NDescription = first_value(Description) over (Partition by Grp Order by ID)
,*
From (
Select *
,Grp = sum(case when len(Code)>=3 then 1 else 0 end) over (order by ID)
From YourTable
) A
)
Select Code = NCode
,Description = NDescription
,Property = Description
,July
,August
From cte
Where len(Code)<3 and Code<>'0'
结果
Code Description Property July August
1000 Input Taxes Koshigaya 65755 48910
1000 Input Taxes Dormitory 15994 25107
2014 Render Account World Garden 65755 48910