标签: t-sql

CASE 语句中的空值

当我为 70-461 考试而学习时,我正在 SSMS 中玩弄一些东西以学习更多知识,但我遇到了一些问题。我正在尝试创建一个表来使用,因此我不必更改/删除 AdventureWorks 或 TSQL2012 数据库中任何已创建的表。在实际创建要使用的表之前,我创建了一个临时表来测试我的代码,这是我用来将值插入表中的代码:

DECLARE @i INT = 1
 WHILE @i < 10
    BEGIN
    INSERT INTO #TestEmployeeCountry 
    VALUES ( SUBSTRING('ABCDEFGHIJKLMNOP', @i, 1), 
        CASE (SELECT ABS(CHECKSUM(NEWID()))%10 +1)
            WHEN 1 THEN 'USA'
            WHEN 2 THEN 'CANADA'
            WHEN 3 THEN 'MEXICO'
            WHEN 4 THEN 'UK'
            WHEN 5 THEN 'FRANCE'
            WHEN 6 THEN 'SPAIN'
            WHEN 7 THEN 'RUSSIA'
            WHEN 8 THEN 'CHINA'
            WHEN 9 THEN 'JAPAN'
            WHEN 10 THEN 'INDIA'
        END)
    SET @i = @i + 1
    END;
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是我不断收到错误消息“无法将值 …

insert t-sql case checksum

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

如何从以下查询中获取分层值?

我有一个名为的表Category,其中有一列名为CategoryID. 同一个表中有一个引用列,称为fParentCategoryID

我需要将所有类别 ID 及其子类别 ID 以逗号分隔。例如 -如果 10 的父类别 ID 为 1,如果 20 的父类别 ID 为 10,那么当我打印类别 ID 20 时,我需要以逗号分隔值打印 1 和 10 作为其父项。

我尝试了以下查询,但我得到NULLParChild列。请帮忙。

;WITH
  cteReports 
  AS
(
SELECT c.CategoryID,
       c.fParentCategoryID,
       [level] = 1,
       ParChild=cast(CAST(c.fParentCategoryID AS VARCHAR(200)) + ',' + CAST(c.CategoryID AS VARCHAR(200)) AS VARCHAR(MAX))
FROM   retail.Category c
WHERE c.fParentCategoryID is NULL
UNION ALL
SELECT c.CategoryID,
       c.fParentCategoryID,
       [level] + 1,
       ParChild = ParChild + ',' + …
Run Code Online (Sandbox Code Playgroud)

cte t-sql subquery sql-server-2012

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

如何在TSQL中没有固定列的情况下进行透视?

我正在努力旋转一个非常简单的表格。网络上的所有示例和教程,都不是我要找的,所以也许你们可以在这里帮助我(我必须说我的 T-SQL 知识不是那么好......)

我来解释一下情况:

我有一张桌子卡车

CREATE TABLE [dbo].[Trucks](
[Id] [int] IDENTITY(1,1) NOT NULL,
[Name] [nvarchar](100) NOT NULL) 

SET IDENTITY_INSERT [dbo].[Trucks] ON 
INSERT [dbo].[Trucks] ([Id], [Name]) VALUES (1, N'AAA-BBB')
INSERT [dbo].[Trucks] ([Id], [Name]) VALUES (2, N'AAA-CCC')
INSERT [dbo].[Trucks] ([Id], [Name]) VALUES (3, N'BBB-WWW')
INSERT [dbo].[Trucks] ([Id], [Name]) VALUES (4, N'SKL-POL')
INSERT [dbo].[Trucks] ([Id], [Name]) VALUES (5, N'QAS-ZSD')
SET IDENTITY_INSERT [dbo].[Trucks] OFF 
Run Code Online (Sandbox Code Playgroud)

每辆卡车都有一定数量的隔间。每个隔间都有名称和容量

CREATE TABLE [dbo].[Compartments](
    [Id] [int]  IDENTITY(1,1) NOT NULL,
    [TruckId] [int] NOT NULL,
    [Compartment] [nvarchar](50) NOT NULL,
    [Capacity] [bigint] NULL) …
Run Code Online (Sandbox Code Playgroud)

sql-server pivot t-sql

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

添加日期时间时交叉应用失败

在尝试实现将Pivot两行数据表合并为一行的-ed 目标时,我的第一个想法是使用Cross Apply. 通过使用Cross Apply可以识别/生成具有从行的唯一 id 派生的特定列名的每一行。(例如,“纬度”源列的“纬度1”和“纬度2”)。

当我使用INTorFLOAT数据类型时一切都很好,但是当我尝试使用DateTimeall VALUESbecome 时DateTime


示例运输纬度/经度/日期时间

我们在两个不同的日子报道了船舶旅程中的两点:

CREATE TABLE #Shipping
(
     [RouteID]     [INT]  NOT NULL,
     [Latitude]    FLOAT NOT NULL, 
     [Longitude]   FLOAT NOT NULL,
     [Time]        DATETIME NOT NULL

);

INSERT #Shipping(RouteID, [Latitude], [Longitude], [Time])
VALUES          (1,         18.0221,    -63.1206,  '24-Jan-2016'), 
                (2,         17.8353,    -62.99667, '25-Jan-2016');
Run Code Online (Sandbox Code Playgroud)

成功的交叉应用 如果我们CrossApply对前三列的数据使用

  SELECT  col+cast([RouteID] as varchar(1)) new_col
         , X.value
       FROM #Shipping
  CROSS APPLY
  (
      VALUES
         (RouteID, …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2012 cross-apply

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

从字符串插入日期:CAST 与 CONVERT

考虑以下两种将日期时间 varchar 字符串转换为日期字段的方法:

SELECT convert(date, '2012-12-21 21:12:00', 20) -- Only date is needed
SELECT cast('2012-12-21 21:12:00' as date) -- Only date is needed
Run Code Online (Sandbox Code Playgroud)

两者都返回我期望的内容:不包括时间的日期,作为日期数据类型。

我的问题是:这两种方式有什么利弊吗?

sql-server t-sql type-conversion azure-sql-database cast

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

是否可以在视图中进行此数学运算?

我的任务是为客户创建一个视图。具体来说,它必须在一个视图中。但是,我不确定如何在视图中进行一些数学运算。我不知道这是否可能。但话又说回来,我的心很虚弱。

我使用的是 SQL Server 2008R2,因此高级OVER()功能不起作用。

假设一个人有 400 美元可以花。他们可以花更多的钱,但前 400 美元是免费的。报告的一列将显示该人在某事上花费的金额,另一列将显示该人需要自掏腰包支付的总金额

因此,对于此人的报告中的第一条记录,一列将显示他们已花费的金额,例如 50 美元,然后第二列将显示 0 美元。在幕后,他们还有 350 美元可以花。

下一个记录是该人花费 300 美元。第二列仍将显示 0 美元,而在幕后,最初的 400 美元现在是 50 美元。

该人的第三项记录显示他们花了 75 美元,但他们从最初的 400 美元中只剩下 50 美元。第二列现在应该有 25 美元的价值。他们已经用尽了最初的 400 美元,现在正在花自己的钱。

第四条记录显示他们花了 40 美元,所以现在第二列将显示 65 美元。等等...

我已经简要阅读了 CTE 和表值函数等,但是是否可以将它们以任意组合使用以提供上述所需的行为?

以下是结构和所需结果的一些示例代码

CREATE TABLE Payroll (
    PersonID int,
    PlanCode varchar(10),
    Deduction int NULL
)
GO

INSERT INTO Payroll (PersonID, PlanCode, Deduction)
VALUES (1, 'Medical', 200)
  ,(1, 'Dental', 250)
  ,(1, …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2008-r2 view running-totals

7
推荐指数
3
解决办法
605
查看次数

将所有相似人物收集到一组

我有一个人有几个 ID。其中一些在 Id1 列中,其中一些在 Id2 中。我想将所有相同的人 ID 收集到一组。

如果 id1=10,则与 id2=20 在同一行。所以这意味着id1=10的人与id2=20是同一个人。

输入和输出示例:

输入

Id1     Id2
---     ---
10      20
10      30
30      30
10      40

50      70
60      50
70      70 
Run Code Online (Sandbox Code Playgroud)

输出

NewId   OldId
-----   -----
1       10
1       20
1       30
1       40

2       50
2       60
2       70
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql graph sql-server-2012

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

如何将 LTRIM 从 Oracle 移植到 SQL Server?

将应用程序从 Oracle 移动到 SQL Server,我有这个伪 Oracle PL/SQL:

SELECT LTRIM(MyColumn, '-, ') FROM MyTable
Run Code Online (Sandbox Code Playgroud)

即我使用Oracle 的LTRIM第二个参数,指定要从字符串左侧修剪的字符。

不幸的是,T-SQL 版本LTRIM不允许我指定要修剪的字符。

目前,我对如何迁移它一无所知LTRIM。在阅读了MyColumn.

这对我来说看起来很不雅观。

我的问题:

是否有任何有意义的方法可以获得LTRIM类似 T-SQL 的功能来传递字符以修剪掉?

编辑1:

我需要替换-,,从字符串的开头。

例如:

SELECT LTRIM(MyColumn, '-, ') FROM MyTable
Run Code Online (Sandbox Code Playgroud)

会导致

   -----, ,,, This is ,- a test,---,
Run Code Online (Sandbox Code Playgroud)

编辑2:

我强烈希望这不是XY 问题

也许重写我的整个查询会LTRIM完全消除对LTRIM.

oracle sql-server plsql t-sql

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

如何按时间采样记录

所以我在 SQL Server 2014 中有一个存储事件的表。事件的生成速度不超过每 10 秒一次,但可能会慢得多(事件之间的几分钟或几小时)。事件之间的时间并不统一。

我想按时间对记录进行抽样。
例如,我想要求一个 10 分钟的采样 - 所以它会抓取记录 1,下一条记录应该是至少 10 分钟后的记录,然后下一条记录至少比第 2 行晚 10 分钟, 等等。

我可以通过迭代方法来实现这一点,循环遍历每条记录,但我想让数据库来完成这项工作。问题是,我不知道如何使用 T-SQL set/window 语句来做到这一点。

谁能帮我吗?

示例数据:

EventID | RecordTime
--------+--------------------
   1    | 2017-04-01 12:00:00
   2    | 2017-04-01 12:00:10
   3    | 2017-04-01 12:00:20
   4    | 2017-04-01 12:00:32
   5    | 2017-04-01 12:05:42
   6    | 2017-04-01 12:09:00
   7    | 2017-04-01 12:24:12
   8    | 2017-04-01 12:36:46
   9    | 2017-04-01 12:36:57
  10    | 2017-04-01 15:00:00
Run Code Online (Sandbox Code Playgroud)

想要的结果:

EventID | RecordTime
--------+--------------------
   1    | 2017-04-01 12:00:00 …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2014

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

关于“统计IO”输出的问题

  • 查询的物理读取总数 = [物理读取] + [预读]?
  • 为什么有时我们有[物理读取]=0 而[预读]>0?这意味着什么?
  • SQL Server 在一次物理读取中读取了多少页?...如果是一对一,那么
  • 为什么当“select * from aTable”时,[物理读取]和/或[预读]的数量不等于表的页数?尽管在执行查询之前清除了缓存。
  • 为什么有时[逻辑读]大于[物理读]+[预读],甚至大于表的总页数?

sql-server t-sql

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