我是 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)
我认为我在正确的轨道上,但我还有很长的路要走。有任何想法吗?
我(未成功)在 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 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
. 但是为了获得有效的查询,如果我选择其中一个InvoiceDate
或InvoiceTotal
——两个非聚合——我必须按它们中的每一个分组以获得有效的查询。
但是按这最后两个分组基本上会撤消其他聚合:如果我按发票日期分组,我将丢失按供应商的聚合,因为每个供应商都有不同的发票日期。
我尝试过进行自联接,在 中使用Invoices AS I1 join Invoices …
我有两张桌子: Part
,OrderLine
:
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)
这样对吗?
我正在运行一个相关的子查询来找出不同城市、州的供应商列表(按供应商名称),即我们想知道与其他供应商没有共同城市和州的供应商。似乎可以自行加入。
如果可能,请仅提供提示。
供应商表是:
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 或其他相关查询。
我有一个表Vendors,其中包含一列VendorContactFname,该列以小写形式编写。
我只想大写它的第一个字母。我想在左边的第一个字母上连接一个 Upper,所有其他剩余的字母都以其原始的小写字母连接到它的右边,即与子字符串:
Upper(Left(VendorContactFname,1) ) +
Substring('VendorContactFName',2, Len('contactFname')-1 )
Run Code Online (Sandbox Code Playgroud)
有一个更好的方法吗?
我有表 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)
有什么想法吗?
我有一个包含表 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 时,例如在 Management Studio 中,后台会发生什么。我们要连接的是什么,是虚拟机还是某处的某个服务器?感谢您的任何解释,参考。等等。