SQL-将所有用户合并到一个表中,不带不规则的空值
我希望null值位于列表的末尾,但将它们放在名称之间SQL-将所有用户合并到一个表中,不带不规则的空值,sql,sql-server,Sql,Sql Server,我希望null值位于列表的末尾,但将它们放在名称之间 KullaniciAdi KisiAdi ------------ ------------ AHMET GÜNDÜZ " Ned Hsoleb(Guzel Alli) " --+ AHMET GÜNDÜZ Raghuvar Masala | . . | . .
KullaniciAdi KisiAdi
------------ ------------
AHMET GÜNDÜZ " Ned Hsoleb(Guzel Alli) " --+
AHMET GÜNDÜZ Raghuvar Masala |
. . |
. . | AHMET GÜNDÜZ Has 10 Friends
. . |
. . |
AHMET GÜNDÜZ Mint Agro -------------------+
ALİ AKKUM Mustafa Saidmurodov -----+
ALİ AKKUM Tarimkoop Ihsangazi |
. . |
. . | ALİ AKKUM Has 9 Friends
. . |
. . |
ALİ AKKUM Ali Uçar ---------------+
YASEMİN AYSEN Pepinier El Fertas --+
. . |
. . | YASEMİN AYSEN Has 6 Friends
. . |
YASEMİN AYSEN Sarker Tredres ------+
这是我的查询联合-所有用户,但不规则的空值;
将@cols声明为NVARCHARMAX,将@query声明为NVARCHARMAX;
设置@cols=STUFFSELECT distinct',当KullaniciAdi='+p.KullaniciAdi+'时为MAXCASE,然后KisiAdi结束为'+QuoteNameep.KullaniciAdi,来自Popper p,用于XML路径,TYPE.value'',NVARCHARMAX',1,1,
将@query='从选择KullaniciAdi、KisiAdi、按KullaniciAdi顺序划分的行数中选择'+@cols+',按EklenmeTarihi将其设置为Popper x GROUP中的RowNum BY RowNum'
EXECUTE@query在GROUPBY语句之后,您需要添加这样的ORDERBY子句,以便将null值推到末尾
ORDER BY
ISNULL(AHMET GÜNDÜZ ,'zzzzz'),ISNULL(ALİ AKKUM ,'zzzzz'),ISNULL(YASEMİN AYSEN,'zzzzz')
此查询将首先输出所有非空值,并将空值推送到最后一行。试试这个
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX), @ordercols as NVARCHAR(MAX);
SET @ordercols = STUFF((SELECT distinct ',case when isnull([' + p.KullaniciAdi + '],''0'')=''0'' then ''0'' else ''1'' end ' FROM Populer p FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'')
SET @cols = STUFF((SELECT distinct ',MAX(CASE WHEN KullaniciAdi = ''' + p.KullaniciAdi + ''' THEN KisiAdi END) AS ' + QUOTENAME(p.KullaniciAdi) FROM Populer p FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'')
set @query = 'SELECT * from(SELECT ' + @cols + ' FROM ( SELECT KullaniciAdi,KisiAdi,ROW_NUMBER() OVER (PARTITION BY KullaniciAdi ORDER BY EklenmeTarihi) AS RowNum FROM Populer ) x GROUP BY RowNum)a order by concat( ' +@ordercols+') desc'
EXECUTE(@query)
您必须通过以下方式将以下代码添加到运算符顺序:case当KisiAdi为null时,则0否则1 end desc 您可以使用ROW_NUMBER来获得结果。下面的SQL将在末尾显示空值。我刚刚用行号修改了您的SQL 输出
在sql查询中为这些列添加order by子句,并检查WHERE?你能给我一个带有代码的示例吗?你已经能够修改在上一个问题中给你的查询了。当然,您可以添加ORDER BY.ORDER BY仍然添加了ORDER BY EklenmeTarihi。我无法理解…我有100多个用户,这意味着查询有100多个“ISNULL”字:你可以将其动态设置为@cols,你只需要添加一个与isnulll的连接就可以了,因为我的sql技能不足以实现你的建议。你能帮我吗?Ajan Balakumaran你在吗?@HasanKaanTURAN你能不能为你的表创建一个提琴,这样我就可以测试查询并给出解决方案。Eklematarihi列中的值是什么?上传日期行EklenmeTarihi列的值是否为null?不可能:我检查过了KisiAdi列的值是否为null?KullaniciAdi ASC的第二个顺序是否不起作用:也将由KisiAdi排序ASC@HasanKaanTURAN,我已更改代码。现在检查表中的列是按字母顺序排列的。但当我尝试在表上执行时,不起作用:。我能把我的数据寄给你吗?你能在我的桌子上测试你的代码吗?
DECLARE
@cols AS NVARCHAR(MAX),
@query AS NVARCHAR(MAX);
SET @cols = STUFF((
SELECT distinct ', MAX(CASE WHEN KullaniciAdi = ''' +
p.KullaniciAdi + ''' THEN KisiAdi END) AS ' +
QUOTENAME(p.KullaniciAdi)
FROM Populer p FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 1,'');
SET @query =
'SELECT ' + @cols +
' FROM (
SELECT KullaniciAdi, KisiAdi,
ROW_NUMBER() OVER
(PARTITION BY KullaniciAdi ORDER BY case when KisiAdi is null then 0 else 1 end desc, EklenmeTarihi) AS RowNum
FROM Populer ) x
GROUP BY RowNum ';
EXECUTE(@query);
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX);
CREATE TABLE #tempPopuler (KullaniciAdi VARCHAR(50), KisiAdi VARCHAR(50))
INSERT INTO #tempPopuler VALUES('AHMET', 'Ned Hsoleb')
INSERT INTO #tempPopuler VALUES('AHMET', 'Raghuvar')
INSERT INTO #tempPopuler VALUES('AHMET', 'Mint Agro')
INSERT INTO #tempPopuler VALUES('ALI', 'Mustafa')
INSERT INTO #tempPopuler VALUES('ALI', 'Tarimkoop')
INSERT INTO #tempPopuler VALUES('YASEMIN', 'Pepinier')
INSERT INTO #tempPopuler VALUES('AHMET', 'A')
INSERT INTO #tempPopuler VALUES('AHMET', 'B')
INSERT INTO #tempPopuler VALUES('AHMET', 'C')
INSERT INTO #tempPopuler VALUES('ALI', 'A')
INSERT INTO #tempPopuler VALUES('ALI', 'B')
INSERT INTO #tempPopuler VALUES('YASEMIN', 'A')
INSERT INTO #tempPopuler VALUES('YASEMIN', 'B')
SET @cols = STUFF((SELECT distinct ',(SELECT KisiAdi FROM (SELECT ROW_NUMBER() OVER (ORDER BY KisiAdi ASC) AS rownumber, KullaniciAdi, KisiAdi FROM [#tempPopuler] where KullaniciAdi = ''' + p.KullaniciAdi + ''') AS foo WHERE rownumber = x.ROW and KullaniciAdi =''' + p.KullaniciAdi + ''') AS' + QUOTENAME(p.KullaniciAdi) FROM #tempPopuler p FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)') ,1,1,'')
set @query = 'SELECT ' + @cols + ' FROM (SELECT KullaniciAdi,KisiAdi, ROW_NUMBER() OVER(ORDER BY KisiAdi ASC) AS [ROW] FROM #tempPopuler) x'
EXECUTE(@query)
DROP TABLE #tempPopuler