所以这就是交易,我有一堆原始数据需要通过C#以编程方式处理和输出,为此我使用SQL
为变量赋值,因为它迭代“发票号”。
发票必须包含限制为70个字符的说明。我也只有5个描述字段,我可以填写。
一些发票超过5个,其他发票只有1个。
所以我有这个:
SELECT DISTINCT top 5
iw.Descript,
NEWID()
FROM staging.InputOrigin iw
left join [Parameters].[VendorMasterUpdate] VMU ON VMU.article = iw.article AND iw.Country=vmu.origin
WHERE post_advice='XXXXXXX'
ORDER BY NEWID()
我正在使用它来获得“前5名”随机描述。
C#分配变量如下:
var Desc1 = table2.Rows[i]["Descript"];
现在我知道我可以参数化i来检查rowscount
,如果rowscount
小于5,那么迭代until i = rowscount
和rowscount
以上的所有内容都有NULL
的描述。
但我正在寻找相反的方向,这是如何在SQL上做到这一点。
任何方式我可以随机获得TOP 5
,如果这个小于5,那么用NULLS
填充额外的值?
我会使用一个计数表(在这种情况下只有5个值),然后是一个LEFT JOIN
:
SELECT V.I,
sq.Descript
FROM (VALUES (1),(2),(3),(4),(5)) V (i)
LEFT JOIN (SELECT TOP 5
iw.Descript,
ROW_NUMBER() OVER (ORDER BY NEWID()) AS RN
FROM staging.InputOrigin iw
LEFT JOIN [parameters].[VendorMasterUpdate] VMU ON VMU.article = iw.article
AND iw.Country = VMU.origin
WHERE post_advice = 'XXXXXXX'
GROUP BY iw.Descript) sq ON sq.RN = V.i;
一种快速而肮脏的方式是:
With CTE as
(... my query...)
, CTE2 as
(
select *
from CTE
union all
select null, null, null -- 1
union all
select null, null, null -- 2
union all
select null, null, null -- 3
union all
select null, null, null -- 4
union all
select null, null, null -- 5
)
select top 5 *
from CTE2
order by thenewidcolumn