C# SQL Server 视图查询

3

我需要创建一个 VIEW 查询...

例如:

Name                   Count
------------------------------
Kaganoff Benzion       122  
Van Gennep             443  
Michelen Luis          656  
kraig Beno             333  
Mogrobejo Endika       555  

*在“名称”列中包含两个单词并用空格分隔的所有名称。

现在,我需要按第一个单词和第二个单词的第一个字母升序排序,并按计数降序排序...

结果应该是:

Name                   Count
------------------------------
kraig Beno             333  
Kaganoff Benzion       122  
Mogrobejo Endika       555  
Michelen Luis          656  
Van Gennep             443  

让我们看看您是否能够做到 :)

1
如果你在计算名字,每个独特的名字只会在列表中出现一次,并且按名称排序后按计数降序排序的要求变得无关紧要,因为它只会作为一个平局的决定因素。 - Joe Stefanelli
嗨Joe,谢谢回复。我认为需要分组,因为在对名称进行排序之后,需要将具有相同起始字母的名称分组并按降序排序... - Joy
你的源表是什么样子的?它是否将名字和姓氏分开了? - Martin Smith
不,只有它们之间的空格... - Joy
1
首先,修正你的数据结构,现在你可能只有两个单词的名称,但不能保证以后仍然是这样。如果你想按独立的名称进行排序,它们应该在插入时被解析为单独的字段。在运行选择查询时进行此解析是一个不好的选择。 - HLGEM
显示剩余3条评论
3个回答

3

类似这样的查询应该可以工作(我已经使用您的数据设置了自己的临时表)

create table #Temp (Name varchar(100), [Count] int)
insert into #Temp (Name, [Count]) VALUES ('Kaganoff Benzion', 122)
insert into #Temp (Name, [Count]) VALUES ('Van Gennep', 443)
insert into #Temp (Name, [Count]) VALUES ('Michelen Luis', 656)
insert into #Temp (Name, [Count]) VALUES ('kraig Beno', 333)
insert into #Temp (Name, [Count]) VALUES ('Mogrobejo Endika', 555)

select
SUBSTRING(Name, 1, PATINDEX('% %', Name)) AS FirstName,
SUBSTRING(Name, PATINDEX('% %', Name) + 1, LEN(Name) - PATINDEX('% %', Name)) AS SecondName,
[Count]
from #Temp
ORDER BY SUBSTRING(Name, 1, 1), SUBSTRING(Name, PATINDEX('% %', Name) + 1, 1), [Count] DESC

drop table #Temp

应该明确指出,我假设您有一个包含两列名为“名称”和“计数”的表,并且“计数”不是聚合值。 - openshac
你是对的。但这是我得到的结果... Kaganoff Benzion 122 Van Gennep 443 Michelen Luis 656 kraig Beno 333 Mogrobejo Endika 555 - Joy
@joy,openshac的查询对我有效,你是否使用了区分大小写的数据库或一些奇怪的排序规则? - HLGEM
你运行了我发布的实际SQL吗?当我运行它时,我得到:kraig Beno 333 Kaganoff Benzion 122 Mogrobejo Endika 555 Michelen Luis 656 Van Gennep 443也许你没有完全正确地复制某些内容? - openshac
谢谢你的帮助和一切,真是太感谢了!这是我的错误...太棒了!我自己尝试了很多次,但都失败了。这里真是聚集了许多天才...我佩服你们 :) 谢谢! - Joy

2

我建议使用公共表达式来处理这个问题。

DECLARE @data TABLE (Name varchar(50), NameCount int);

INSERT INTO @data (Name, NameCount)
SELECT 'Kaganoff Benzion', 122
UNION SELECT 'Van Gennep', 443
UNION SELECT 'Michelen Luis', 656
UNION SELECT 'kraig Beno', 333
UNION SELECT 'Mogrobejo Endika', 555;

--Now that we have the data setup, use a CTE...

WITH NamesAndLetters AS
(
    SELECT 
          SUBSTRING(UPPER(Name), 1, 1) [FirstNameLetter]
        , SUBSTRING(UPPER(Name), PATINDEX('% %', Name) + 1, 1) [LastNameLetter]
        , Name
        , NameCount
    FROM @data
)
SELECT Name, NameCount
FROM NamesAndLetters 
ORDER BY 
      FirstNameLetter ASC
    , LastNameLetter ASC
    , NameCount DESC

抱歉第一篇帖子有误...一开始没注意到“名称”是一个列。

我没有选择这条路,因为我认为所请求的输出似乎是一个未更改的列选择(即[名称],[计数]进和[名称],[计数]出)。话虽如此,如果您需要执行更复杂的查询,则我认为CTE是正确的方法,这是基本示例的好例子。+1 - Jason Benson

0

除非我没有理解你的问题...在不影响输出的情况下,完全可以在Order By子句中拆分单个列。

例如:

Select [Name], [Count]
from [YourView]
Order By 
    Substring([Name], 1, 1) , 
    SUBSTRING([Name], PATINDEX('% %', [Name]) + 1, PATINDEX('% %', [Name]) + 2), 
    [Count] Desc

也许我只是有点困惑,你是想推导计数还是怎样?不过无论如何,这个输出结果与你要求的完全一致。


你可能想要:按... [计数] 降序排序 - openshac
非常感谢,感激不尽。建议:请注意HLGEM的警告,将两组数据存储在同一列中只会引发问题,如果您需要访问其中一个(即FirstName + LastName = Name)。现在是解决这个问题的时候,因为以后转换会更加困难。此外,您的查询也更容易:从YourTable选择FirstName、LastName和[Count],按Substring(FirstName, 1, 1)、Substring(LastName, 1, 1)、[Count] DESC排序(或者取消子字符串,让SQL按字母顺序排序First/Last)。 - Jason Benson

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接