小编Bel*_*igh的帖子

为 EmpName 返回一行

我的表中可能有也可能没有相同的员工姓名。问题是我无法知道 Table1 是否会包含更多名称,或者 Table2 是否会包含更多名称,所以我认为联合可以解决这个问题。但是,正如您在下面的语法中看到的那样,它会生成“C”的行,因为它存在于两个表中。这是我想要的输出

empName | TotalSW | TotalSNT  
--------+---------+---------
A       |       1 |       0
B       |       1 |       0
C       |       1 |       1
x       |       0 |       1
z       |       0 |       1
Run Code Online (Sandbox Code Playgroud)

使用下面的 DDL 如何编写查询以生成此输出?

Create Table #Test1
(empName varchar(100), swas varchar(100))

Create Table #Test2
(empName varchar(100), swont varchar(100))

Insert Into #Test1 (empName, swas) VALUES
('A', 'res1'), ('B', 'tim1'), ('C', 'run34')

Insert Into #Test2 (empName, swont) VALUES
('C', 'er12'), ('z', 'nn12'), ('x', '23rw')


Select empName, TotalSW …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2008-r2

5
推荐指数
2
解决办法
130
查看次数

LEFT JOIN 产生夸大的 COUNT() 数字

我有 3 张表正在使用Right Join。数据设置如下 - 我的问题是返回的数字不准确,因此当我执行查询时,我得到了返回(这是准确值的两倍和三倍)

vendor     TotalSales   TotalCases
Vendor 1    61.40          6
Run Code Online (Sandbox Code Playgroud)

但如果你手动计算它应该是

vendor     TotalSales   TotalCases
Vendor 1    30.70          2
Run Code Online (Sandbox Code Playgroud)

我必须在查询中更改哪些内容才能返回上述结果?

  Declare @BBC Table
  (
    vendor varchar(250)
    ,vendorcasenum varchar(100)
    ,casenumdate date
  )

  Declare @AllVendor Table
  (
    vendor varchar(250)
  )

  Declare @TotalSalesAmt Table
  (
    vendor varchar(250)
    ,saleamt decimal(10,2)
  )

  Insert Into @TotalSalesAmt (vendor, saleamt) VALUES
  ('Vendor 1', '10.20'), ('Vendor 2', '10.10'), ('Vendor 1', '.40')
  ,('Vendor 1', '20.10'), ('Vendor 2', '20.10'), ('Vendor 3', '20.00')

  Insert Into @AllVendor (vendor) Values …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2008-r2

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

为什么在查询结果中忽略 Null

我有一个与下面结构相似的表,一个字段中有一个NULL值。当我查询表时,这条记录没有返回,它被省略了。应如何更改查询以返回此记录?

Declare @Fiesty Table
(  
  numberfour varchar(100)
  ,valid varchar(20)
)

Insert Into @Fiesty (numberfour, valid) Values
('1ACRELBS', NULL), ('4ACRELBS', 'Green'), ('17ACRELBS', 'White')

Select * FROM @Fiesty WHERE valid NOT IN ('Green', 'Blue', 'White')
Run Code Online (Sandbox Code Playgroud)

我预期的返回结果将是 numberfour = 1ACRELBS

null sql-server sql-server-2008-r2

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

查看现有的表值参数

我看过很多关于如何创建表值参数的教程 - 但是如何在创建表值参数后查看它?

我更喜欢在 SSMS 中使用 GUI 的方法,但 T-SQL 也足够了。

sql-server t-sql sql-server-2008-r2 table-valued-parameters

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

加速查询的方法

我的查询返回大约 590 行和 8 列。我遇到的问题是从开始到结束查询需要 2 分 30 秒才能完成。这里的一群人教会了我很多如何编写更有效的查询,所以这里是另一个!

我使用的是date变量而不是变量,datetime因为我的变量只包含一个日期 - 我还使用Aaron Bertrand - Bad Habits To Kickyyyymmdd建议的格式存储我的日期。

我可以做些什么来优化此查询并使结果返回得更快?

DECLARE @Startdate date = '20170101', 
        @Enddate   date = '20170131';

WITH fc As
(
    Select
    Teacher
    ,Team
    ,fc
    FROM [Helper].[dbo].[fc]
)
,ia As
(
    Select
    Teacher
    ,tia
    FROM dbo.ia
    WHERE [hiredate] >= @Startdate
    AND [hiredate] <  DATEADD(DAY,1,@Enddate)
)
,inb As
(
    Select 
    Teacher
    ,tinb
    FROM inb
),
ripcord As
(
    Select
    Teacher
    ,pit
    FROM [homebase].[dbo].[rip] …
Run Code Online (Sandbox Code Playgroud)

sql-server optimization cte t-sql sql-server-2008-r2

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

使用计数更新查询

我正在尝试运行以下更新查询

UPDATE x
SET totalval = COUNT(projs)
FROM Prs x
LEFT JOIN es y
ON x.CS = y.CS
Run Code Online (Sandbox Code Playgroud)

但是,我收到错误:

消息 157,级别 15,状态 1,第 2 行
聚合可能不会出现在 UPDATE 语句的集合列表中。

应如何更改此语句才能使其成为有效的更新语句?

sql-server t-sql sql-server-2008-r2

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

使用 Row_Number() 的无效列

我试图只选择从查询返回的第一行。这是我的语法->

insert into @Temp (id, salesID)
select
    RN = ROW_NUMBER() OVER(order by t.psUserID)
    ,t.psUserID
from (
    select distinct 
    psUserID = rstln.Bama   
    From rusticlines rstln  
    AND tnr.Active = '1') t
WHERE RN = 1;
Run Code Online (Sandbox Code Playgroud)

我得到错误:

消息 207,级别 16,状态 1,第 51 行
无效的列名称“RN”。

我需要更改什么才能只选择第一行号?

sql-server t-sql sql-server-2008-r2

3
推荐指数
2
解决办法
2373
查看次数

如何对 Varchar 数据类型求和

在 SQL Server 2008 中,我有一个结构相似的表。不幸的是,改变数据结构不是一种选择,所以我一直试图想出一个替代方案。我曾尝试运行此查询,但出现以下错误:

(受影响的 5 行)
消息 8114,级别 16,状态 5,第 9行将
数据类型 varchar 转换为数字时出错。

这是 DDL - 应该在查询中更改什么语法才能接收有效输出而不是错误消息?

Declare @GreenHouse Table
(nomen varchar(100), vtc varchar(100), d1 date)

Insert Into @GreenHouse (nomen, vtc, d1) VALUES
('Green', '507.02', '2016-01-14'), ('Green', '4.44089e-015', '2016-01-03')
,('Green', '200.57', '2016-01-18'), ('Green', '649.01', '2016-01-19'),
('Green', '1849.85', '2016-04-30')

Select nomen, Round(Sum(Cast(vtc As Decimal(10,2))),0.00) As FormatedInfo, d1
FROM @GreenHouse Group By nomen, d1 Order By d1 DESC 
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2008-r2

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

SQL中的除法

我想将 int 数量除以一个数字,但我的输出不是我想要的。这是我的 DDL

Create Table Orders 
(
    id int IDENTITY(1,1) PRIMARY KEY NOT NULL
    ,partid varchar(100) NOT NULL
    ,qtyordered int DEFAULT '0'
    ,orderedby varchar(100) NOT NULL
    ,ordereddate date DEFAULT GETDATE()
)

Insert Into Orders (partid, qtyordered, orderedby) VALUES
('SS100', 10, 'James'), ('RR200', 5, 'Bob'), ('NN300', 3, 'Jake'), ('OO400', 5, 'Blue')
Run Code Online (Sandbox Code Playgroud)

现在我已经尝试使用 SQL Server 函数Ceiling()Floor()但没有得到我想要的输出。这是我试过的查询,我需要在 SQL Server 中做什么才能得到 2, 2, 1 的输出?

Select
partid
,CEILING(qtyordered/3) As [First] --want to be 2
,CEILING(qtyordered/3) As [Second] --want to …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2008-r2

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

更新 SQL Server 中的前 1 行

我知道通常你会有一个自动编号字段 - 但在这种情况下没有,老实说,更新哪一行并不重要,只要它只有 1。

我有一个 DDL 示例,例如一张包含请求数量的表和一张包含可用数量的表。我想@Test1.amtonhand使用 from 的值进行更新@Test2.amtonhand并加入,@Test1.nrs=@Test2.nrs但只更新 1 条记录@Test1

这是如何在 SQL Server 2008 中实现的

    Declare @Test1 Table
(
    nrs varchar(100)
    ,amtrqst varchar(100)
    ,amtonhand varchar(100)
)

Declare @Test2 Table
(
    nrs varchar(100)
    ,amtonhand varchar(100)
)


Insert Into @Test1 (nrs, amtrqst) Values
('abc', '10'), ('abc', '12'), ('abc', '13'), ('def', '5'), ('def', '12')

Insert Into @Test2 (nrs, amtonhand) Values
('abc', '10'), ('def', '5')
Run Code Online (Sandbox Code Playgroud)

编辑
我想要的更新结果是

@Test1 --
abc, 10, 10
abc, 12
abc, 13 …
Run Code Online (Sandbox Code Playgroud)

sql-server-2008 t-sql sql-server-2008-r2

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