C# SQL Server VIEW 查询

Posted

技术标签:

【中文标题】C# SQL Server VIEW 查询【英文标题】:C# SQL Server VIEW Query 【发布时间】:2011-01-12 14:53:16 【问题描述】:

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

例如:

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

*“名称”列中的所有名称,包含两个单词,中间有一个空格。

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

结果应该是:

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

让我们看看你是否可以:)

【问题讨论】:

如果您计算名称,每个唯一名称将仅在列表中出现一次,并且在按名称排序后按计数降序排序的要求变得没有实际意义,因为它仅与决胜局相关. 嗨,乔,感谢您的回复。我认为需要分组,因为在对名称进行排序后,需要将具有相同起始字母的名称分组并按降序排序... 你的源表是什么样的?名字和姓氏分开了吗? 没有。它们之间只有一个空格... 先修复你的数据结构,你现在可能只有两个词名,不保证会继续。如果要对单独的名称进行排序,则应在插入时将它们解析为单独的字段。在运行 selct 查询时执行此解析是一个糟糕的选择。 【参考方案1】:

类似这样的查询应该可以工作(我已经用你的数据建立了自己的临时表)

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

【讨论】:

应该只是声明我正在假设您有一个包含两列名为“名称”和“计数”的表,并且“计数”不是聚合值。 你是对的。但这是我得到的结果... Kaganoff Benzion 122 Van Gennep 443 Michelen Luis 656 kraig Beno 333 Mogrobejo Endika 555 @joy,openshac 的查询对我有用,您使用的是区分大小写的数据库还是一些会影响排序的奇怪排序规则? 您运行过我发布的实际 SQL 吗?当我运行它时,我得到: kraig Beno 333 Kaganoff Benzion 122 Mogrobejo Endika 555 Michelen Luis 656 Van Gennep 443 也许你已经完全正确地复制了一些东西? 谢谢你!为您的帮助和一切。我的错……太好了!我自己尝试了很多,但不能...天才都在这里...我鞠躬:)谢谢!【参考方案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

很抱歉第一次发帖...我一开始没有看到 Name 是一列。

【讨论】:

我没有走这条路,因为在我看来,请求的输出似乎是未更改的列选择(即 [Name]、[Count] in 和 [Name]、[Count] out),它说如果您需要执行更复杂的查询,我认为 CTE 是可行的方法,这是基本查询的一个很好的例子。 +1【参考方案3】:

除非我只是不明白你的问题...完全可以在 Order By 子句中拆分单个列而不影响输出。

例子:

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

也许我只是感到困惑,你想推导出计数还是?无论如何,此输出与您请求的输出完全匹配。

【讨论】:

你可能想要:Order By ... [Count] DESC 非常感谢,不胜感激。建议:请注意 HLGEM 警告,如果您只需要访问一个(即 FirstName + LastName = Name),则如果您只需要访问一组数据,则在其中存储一组数据只是在问问题。现在是解决这个问题的时候了,因为它只会在以后变得更难转换。此外,您的查询也更容易: Select FirstName, LastName, [Count] from YourTable Order By Substring(FirstName, 1, 1), Substring(LastName, 1, 1), [Count] DESC (OR nix the substring and just let SQL 按字母顺序排序第一/最后)

以上是关于C# SQL Server VIEW 查询的主要内容,如果未能解决你的问题,请参考以下文章

使用 VBA 从 SQL Server 查询 VIEW

SQL Server 中的慢速两表查询

从多个表中创建 Sql Server VIEW GROUPing BY,选择子查询作为别名

winform,用c#链接 sql server。对数据库进行查询记录,增加记录,删除记录。,修改记录。

如何避免从 C# 构建的 Sql Server 2005 参数化查询变慢

C# 中不同数据库(如 Oracle 和 SQL Server)之间的 Sql 查询 [关闭]