小编nth*_*nth的帖子

非重复记录的SQL查询

我正在尝试构建一个将返回表中所有非重复(唯一)记录的查询.查询将需要使用多个字段来确定记录是否重复.

例如,如果表具有以下字段; PKID,ClientID,Name,AcctNo,OrderDate,Charge,我想使用AcctNo,OrderDate和Charge字段来查找唯一记录.

PKID-----ClientID-----Name-----AcctNo-----OrderDate-----Charge
1        JX100        John     12345      9/9/2010      $100.00
2        JX220        Mark     55567      9/9/2010       $23.00
3        JX690        Matt     89899      9/9/2010      $218.00
4        JX100        John     12345      9/9/2010      $100.00
Run Code Online (Sandbox Code Playgroud)

查询的结果需要是:

PKID-----ClientID-----Name-----AcctNo-----OrderDate-----Charge
2        JX220        Mark     55567      9/9/2010       $23.00
3        JX690        Matt     89899      9/9/2010      $218.00
Run Code Online (Sandbox Code Playgroud)

我尝试过使用SELECT DISTINCT,但这不起作用,因为它在结果中保留了一个重复的记录.我也尝试使用HAVING COUNT = 1,但返回所有记录.

谢谢您的帮助.

sql duplicates

8
推荐指数
2
解决办法
7万
查看次数

一起使用SQL JOIN和UNION

好的,我很困惑为什么会出现以下行为。

我有一个“交易标头”表和“交易明细”表。对于某些功能,详细信息表需要一些规范化才能提取“备注”数据。每个详细记录中最多可以包含3个由TranRemark1,TranRemark2和TranRemark3列指定的注释。

我整理了以下查询,认为它可以工作,但返回的记录数不正确。

SELECT  
b.ClientName,
a.TranID,
a.TranRemark1,
a.TranDateOfService,
a.TranPayment   
FROM
(select TranRemark1, TranID from TranDetail
union all
select TranRemark2, TranID from TranDetail
union all
select TranRemark3, TranID from TranDetail) AS a
LEFT JOIN TranHeader AS b ON
b.TranID = a.TranID
WHERE a.TranRemark1 = @RemarkCode;
Run Code Online (Sandbox Code Playgroud)

我得到的结果集基于与ClientName匹配的TranHeader记录的数量,而不是与TranDetail中的where子句匹配的记录的数量。例如,如果客户“ Acme Inc.” 标头表中有3条记录,我使用上面的查询来查询注释代码“ 1234”(与TranDetail中只有1条记录匹配),结果集列出了正确的记录3次。

编辑 所以我希望从上面的例子中得到这样的结果集:

ClientName--TranID--TranRemark1--TranDateOfService--TranPayment
Acme Inc    ADC11   1234         8-16-2011          45.11    
Run Code Online (Sandbox Code Playgroud)

我得到的是:

ClientName--TranID--TranRemark1--TranDateOfService--TranPayment
Acme Inc    ADC11   1234         8-16-2011          45.11    
Acme Inc    ADC11   1234         8-16-2011          45.11  
Acme Inc    ADC11   1234         8-16-2011          45.11  
Run Code Online (Sandbox Code Playgroud)

请记住,TranHeader中的一个客户端可以有多个记录。

我已经尝试过正确和完全加入,但是一切都一样。 …

sql sql-server union join sql-server-2008

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

SQL Left加入求和列的加倍值

我有2个表需要查询并返回"异常"的结果集,基于table1中的字段总和是否等于table2中字段的总和(其他列匹配).

select A.TranName,A.TranDate,A.TranCode,SUM(A.TranQty) AS T1Qty,B.TranName,B.TranDate,B.TranCode,SUM(B.TranQty) AS T2Qty
from Table1 AS A
LEFT JOIN Table2 AS B
on A.TranName = B.TranName AND A.TranDate = B.TranDate AND A.TranCode = B.TranCode
GROUP BY A.TranName, A.TranDate, A.TranCode, B.TranName, B.TranDate, B.TranCode
HAVING SUM(A.TranQty) != SUM(B.TranQty)
Run Code Online (Sandbox Code Playgroud)

结果集不正确,因为它将Table1.TranQty总和乘以Table2返回的行数.

例如,如果Table1有1条记录,其中连接匹配Table2中的2条记录,则Table1中1条记录的TranQty将乘以2(因此不正确匹配).

我确定我遗漏了一些关于在左连接中使用聚合函数(sum)的基本知识.

谢谢您的帮助!

(系统是MSSql)

sql sum left-join

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

将SQL Server存储过程结果与其他文本连接在一起

我想以一种尽可能简单的方式获取存储过程的结果并将其与其他文本连接起来.

这些方面的东西:

存储过程:

CREATE PROCEDURE [dbo].[sp_UserFriendlyText] @Text varchar(100)
AS
BEGIN
SELECT CASE @Text
     WHEN 'Foo' THEN 'Beginning'
     WHEN 'bar' THEN 'End'
     ELSE 'Text Not Found'
END
END
Run Code Online (Sandbox Code Playgroud)

它将被引用如下:

DECLARE @Var1 varchar(100)
SET @Var1 = 'Foo'    
EXEC dbo.sp_UserFriendlyText @Var1 + ' is the best'
Run Code Online (Sandbox Code Playgroud)

期望的结果是"开始是最好的".

它抱怨我的语法不正确.我尝试在exec语句周围添加括号来创建优先级,但它仍然不起作用.

因为sproc将在多个查询中被引用,所以我想在没有输出声明的情况下运行它,如果可能的话(只是为了使事情更清洁).

系统是SQL Server 2008 R2.

谢谢!

sql-server stored-procedures concatenation

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