小编MSI*_*SIS的帖子

使用 T-SQL 测试字符串是否为回文

我是 T-SQL 的初学者。我想确定输入字符串是否是回文,如果不是,则输出 = 0,如果是,则输出 = 1。我仍在弄清楚语法。我什至没有收到错误消息。我正在寻找不同的解决方案和一些反馈,以更好地理解和了解 T-SQL 的工作原理,从而变得更好——我仍然是一名学生。

在我看来,关键思想是将最左边和最右边的字符相互比较,检查是否相等,然后继续比较左边第二个字符和倒数第二个字符,依此类推。我们做一个循环:如果字符彼此相等,我们继续。如果到达终点,则输出 1,否则,输出 0。

请您批评一下:

CREATE function Palindrome(
    @String  Char
    , @StringLength  Int
    , @n Int
    , @Palindrome BIN
    , @StringLeftLength  Int
)
RETURNS Binary
AS
BEGIN
SET @ n=1
SET @StringLength= Len(String)

  WHILE @StringLength - @n >1

  IF
  Left(String,@n)=Right(String, @StringLength)

 SET @n =n+1
 SET @StringLength =StringLength -1

 RETURN @Binary =1

 ELSE RETURN @Palindrome =0

END
Run Code Online (Sandbox Code Playgroud)

我认为我在正确的轨道上,但我还有很长的路要走。有任何想法吗?

sql-server t-sql sql-server-2012 functions

24
推荐指数
8
解决办法
7790
查看次数

相关子查询 SQL Server 2014

我(未成功)在 Invoices 表上使用相关子查询:

Invoices(InvoiceID,  VendorID, InvoiceTotal, PaymentTotal, CreditTotal,.... ),
Run Code Online (Sandbox Code Playgroud)

找到所有供应商的最大未付发票的总和,其中未付条件由下式给出InvoiceTotal-PaymentTotal-CreditTotal <0

 Select Sum(LargestUnpaid) from 
 (Select   Max(InvoiceTotal) AS LargestUnpaid from Invoices 
  where InvoiceTotal-(PaymentTotal+CreditTotal)<0 group by vendorID ) ;
Run Code Online (Sandbox Code Playgroud)

内部查询运行,有好有坏,因为查询应该是相关的,但查询作为一个整体没有运行,我收到错误消息:

Msg 102, Level 15, State 1, Line 4 Incorrect syntax near ')'.
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

sql-server subquery

7
推荐指数
1
解决办法
335
查看次数

令人困惑的查询:混合聚合和非聚合

希望有人能澄清如何从 SQL Server 2012 中执行此查询,或者它可能在问什么;似乎我被要求做一个将聚合与非聚合相结合的查询,这导致了一个看似不可能的查询,因为一个人只能按出现在Select子句中的字段进行分组,这会使查询变得混乱。

我被要求对表进行查询Invoices

Invoices (InvoiceID, VendorID,InvoiceDate, InvoiceTotal,...)
Run Code Online (Sandbox Code Playgroud)

我被要求执行一个生成 6 列的查询:3 列已经“按原样”出现在表中: VendorID, InvoiceDate, InvoiceTotal

其他 3 列是聚合:

4) Sum(InvoiceTotal) AS VendorTotal: 每个发票的总和VendorID

5) Count(InvoiceID) AS VendorCount: 每个发票的数量VendorId

6) Avg(InvoiceTotal) AS VendorAvg: 平均每张发票VendorId


现在,问题是不能在同一个查询中组合(除了我不能在这里使用的例外)聚合和非聚合,除非按非聚合分组。所以我可以这样做:

Select 
    VendorId, InvoiceDate, InvoiceTotal, 
    Sum(InvoiceTotal) AS VendorTotal, 
    Count(InvoiceId) AS VendorCount, 
    Avg(InvoiceTotal) AS VendorAvg 
GROUP BY
    VendorID 
Run Code Online (Sandbox Code Playgroud)

现在,如果我只是group by VendorID. 但是为了获得有效的查询,如果我选择其中一个InvoiceDateInvoiceTotal——两个非聚合——我必须按它们中的每一个分组以获得有效的查询。

但是按这最后两个分组基本上会撤消其他聚合:如果我按发票日期分组,我将丢失按供应商的聚合,因为每个供应商都有不同的发票日期。

我尝试过进行自联接,在 中使用Invoices AS I1 join Invoices …

sql-server sql-server-2012

5
推荐指数
1
解决办法
2861
查看次数

NOT IN(与连接一起)查询

我有两张桌子: PartOrderLine

Part (PartNum PK, PartDesc, Price)

OrderLine (OrderNum PK, PartNum PK, QtyOrdered)
Run Code Online (Sandbox Code Playgroud)

我想找出订购的零件。我想我有一个好主意,但我可能遗漏了一些东西;我认为最有可能在语法上。请检查:

select Part.PartNum
    ,OrderLine.OrderNum
from OrderLine
inner join Part on OrderLine.PartNum = Part.PartNum
where PartNum not in (
        select distinct (OrderNum)
        from OrderLine
        )
Run Code Online (Sandbox Code Playgroud)

这样对吗?

join sql-server t-sql sql-server-2014

4
推荐指数
1
解决办法
96
查看次数

SQL Server 2014 中的相关子查询

我正在运行一个相关的子查询来找出不同城市、州的供应商列表(按供应商名称),即我们想知道与其他供应商没有共同城市和州的供应商。似乎可以自行加入。

如果可能,请仅提供提示。

供应商表是:

Vendors(VendorID P, VendorCity, VendorState, VendorName,...)
Run Code Online (Sandbox Code Playgroud)

这就是我所拥有的:

Select VendorName, VendorCity, VendorState from Vendors AS V1 where
         VendorCity, VendorState NOT IN (Select VendorCity, VendorState FROM
          Vendors AS V2 where V2.VendorID <> V1.VendorID)
Run Code Online (Sandbox Code Playgroud)

这是我收到的错误消息:

消息 4145,级别 15,状态 1,第 2 行 在“,”附近的预期条件的上下文中指定的非布尔类型的表达式。

我不明白为什么要引用布尔类型,因为这不是 EXISTS 或其他相关查询。

sql-server subquery

4
推荐指数
2
解决办法
389
查看次数

仅将姓名的第一个字母大写

我有一个表Vendors,其中包含一列VendorContactFname,该列以小写形式编写。

我只想大写它的第一个字母。我想在左边的第一个字母上连接一个 Upper,所有其他剩余的字母都以其原始的小写字母连接到它的右边,即与子字符串:

Upper(Left(VendorContactFname,1) ) + 
Substring('VendorContactFName',2, Len('contactFname')-1 ) 
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?

sql-server sql-server-2012

2
推荐指数
1
解决办法
2668
查看次数

相关子查询以查找大于状态平均值的总数

我有表 Vendors (VendorName, VendorState,....) 和 Invoices (InvoiceID, InvoiceTotal,...)。我想获得大于平均状态 InvoiceTotal 的发票(作为 InvoiceId)。

我知道我首先找到每个州的平均总数:

SELECT  VendorState, Avg(InvoiceTotal) AS AvgStateInvoice
from Invoices I join Vendors V on V.VendorID= I.VendorID 
group by VendorState
Run Code Online (Sandbox Code Playgroud)

所以我现在有按州列出的平均 InvoiceTotal 列表。现在我需要弄清楚:

如何进行外部查询以选择那些大于州平均水平的发票,这就是我迷路的地方,因为我不记得进行比较的语法。我想它会是这样的:

SELECT InvoiceId from Invoices where InvoiceTotal > .....?
Run Code Online (Sandbox Code Playgroud)

有什么想法吗?

sql-server subquery sql-server-2012

2
推荐指数
1
解决办法
588
查看次数

MSSQL Server 2012 查询我们是否需要 T-SQL 来使用 IF 条件进行查询?

我有一个包含表 Student(StudId, StudName,...) 和 Grades (GradeExam1, GradeExam2,..) 等的数据库。我想做一个查询来为每个年级分配一个字母等级。我正在考虑做类似的事情:

SELECT StudId, GradeExam1 AS 'A' IF GradeExam1>= 90 AND GradeExam1 <=100
UNION
SELECT StudID, GradeExam1 AS 'B' ..........
Run Code Online (Sandbox Code Playgroud)

我知道我可以在普通 SQL 中使用非条件别名,但我从未在 SQL 查询中使用过条件别名。

或者我可能需要 T-SQL 来为给定的考试做一个循环,而不是为不同的条件做一个 select 语句的联合?

提前致谢。

sql-server t-sql

2
推荐指数
1
解决办法
303
查看次数

当我们连接到 SQL Server 时我们在做什么?

如果这很简单,或者与本网站无关,我很抱歉:我只是想知道当一个人连接到 SQL Server 时,例如在 Management Studio 中,后台会发生什么。我们要连接的是什么,是虚拟机还是某处的某个服务器?感谢您的任何解释,参考。等等。

sql-server

1
推荐指数
1
解决办法
98
查看次数