标签: t-sql

有条件更新column1或column2或column3

我想写一个SQL更新语句,比如

UPDATE p
SET CASE WHEN inv.name='your' THEN p.your_qty=inv.qty
    CASE WHEN inv.name='other' THEN p.other_qty=inv.qty
    CASE WHEN inv.name='my' THEN p.my_qty=inv.qty
FROM products p
JOIN Qty_products_inv inv
ON p.itemNo= inv.itemNo
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server

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

重复的值不应在 SQL 中一起显示

我想显示一些数据,我的要求是重复的值不应显示在相邻的位置。现在表中的数据是按这个顺序排列的

ID     Name
1   A
2   A
3   B
4   C
5   B
6   B
7   C
8   C
9   C
Run Code Online (Sandbox Code Playgroud)

预期结果 - 应按以下顺序排列

ID   Name
1   A
3   B
4   C
2   A
5   B
7   C
6   B
8   C
9   C
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server

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

如何合并 OUTER JOIN 和 UNION 结果?

我有两个表,我想要两个表中的所有数据。如果表具有匹配的 AssetID,则将它们连接到一行。如果没有,则在单独的行上。完整的外部联接听起来像是正确的方法,但我在如何根据它来自哪个表来选择键方面遇到了问题。

TABLE A                 TABLE B
AssetID | Valuable      AssetID | Protected 
-------------------    -------------------
123     | Yes           123     | Yes   
456     | No            321     | No
653     | Yes   
        
Run Code Online (Sandbox Code Playgroud)

目标:

TABLE C     
AssetID | Valuable | Protected
---------------------------
123 | Yes   |Yes
456 | No    |
653 | Yes   |
321 |       |No


SELECT TableA.AssetID, TableA.Valuable, TableB.Protected
FROM (
    SELECT AssetID, Valuable
    FROM TableA
) ta    
FULL OUTER JOIN (
    SELECT AssetID, Protected
    FROM TableB   
) tb ON ta.AssetID=tb.AssetID
    
    
Run Code Online (Sandbox Code Playgroud)

生产 …

sql t-sql sql-server select full-outer-join

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

where 子句中的日期返回 0 行

我试图按如下方式获取数据, WHERE DateCommande = '2018-09-05' 但它在我的计算机上不起作用。

SELECT * 
  FROM dbo.Commande;
Run Code Online (Sandbox Code Playgroud)

返回行,包括在列中显示2018-09-05为日期时间值的行datetime

但是,在我的计算机上的 SSMS 上,如果我添加一个WHERE子句,查询将返回 0 行:

SELECT *
  FROM dbo.Commande
  WHERE DateTimeColumn = '2018-09-05 00:00:00.000';
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server sql-server-2019 sql-server-2019-express

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

where 子句中的日期时间条件无法正常工作

我的表中有一行第一列日期时间类型:

2021-11-01 08:51:56.123 102 296 
Run Code Online (Sandbox Code Playgroud)

当我使用下面的选择命令时,我得到相同的结果(这一行):

select * from  cmd where timestamp = convert(datetime, '2021-11-01 08:51:56.122')
select * from  cmd where timestamp = convert(datetime, '2021-11-01 08:51:56.123')
select * from  cmd where timestamp = convert(datetime, '2021-11-01 08:51:56.124')
Run Code Online (Sandbox Code Playgroud)

我请求只有第二个命令选择该行。

怎么做?

SQL Server 版本为 14

sql t-sql sql-server datetime where-clause

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

按过去 5 年过滤的 SQL 语句

我目前正在编写一个 SQL 语句来过滤过去 5 年的数据,我添加了下面的 where 子句,这将使我从今天起正好 5 年。

我想问如何改进此报表以包含第 5 年的所有数据。

例如,如果今天运行,则数据不会来自 16/11/2016,而是来自 01/01/2016。

其中语句:

WHERE CreatedDate > DATEADD(YEAR,-5,GETDATE())
Run Code Online (Sandbox Code Playgroud)

t-sql sql-server

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

最近 7 天至今的原始 SELECT(不含 FROM)

我想获取最近 7 个日期(没有时间)的查询结果(例如填充表)。我知道我们可以在没有 FROM 语句的情况下选择一些标量。所以我最终得到了以下解决方案:

select DATEADD (DAY, 0, CONVERT(date, GetDate()))
Union
select DATEADD (DAY,-1, CONVERT(date, GetDate()))
Union
select DATEADD (DAY,-2, CONVERT(date, GetDate()))
Union
select DATEADD (DAY,-3, CONVERT(date, GetDate()))
Union
select DATEADD (DAY,-4, CONVERT(date, GetDate()))
Union
select DATEADD (DAY,-5, CONVERT(date, GetDate()))
Union
select DATEADD (DAY,-6, CONVERT(date, GetDate()))
Run Code Online (Sandbox Code Playgroud)

如果有的话,请指出更好(更优雅)的解决方案。

sql t-sql sql-server date

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

拆分一列并获取所有计算行

我有一张由以下内容组成的表格:

ID 文本 职位编号 职位ID
1 托托 45 56,58
2 塔塔 45 45.51
3 蒂蒂 46

我想要:

ID 文本 计算的作业ID
1 托托 45
1 托托 56
1 托托 58
2 塔塔 45
2 塔塔 51
3 蒂蒂 46

我尝试过的

我尝试过交叉应用:

SELECT 
   Id, Text, x.value as CalculatedJobId
FROM tbl_data
CROSS APPLY string_split(jobsIds, ',') x
WHERE x.value <> ''
Run Code Online (Sandbox Code Playgroud)

但是 JobsIds 中不包含 jobId 的情况消失了,jobIds 为空的情况也消失了。所以我得到了:

ID 文本 计算的作业ID
1 托托 56
1 托托 58
2 塔塔 45
2 塔塔 51

我尝试交叉应用两次,但这不是正确的语法:

SELECT …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server

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

删除电话号码中的尾随零

我有一个旧的 Phone 表,其中有一个长度为 15 的 PhonoNo 列。现在我正在执行一项电话号码清理任务,其中 10 位数字后有尾随 0。

+----------------+---------------+
|    PhoneNo     | Desire output |
+----------------+---------------+
|198765432100000 |    1987654321 |
|   198765432100 |    1987654321 |
|     1987653210 |    1987653210 |
|    19876543210 |    1987654321 |
|198765432100100 | 1987654321001 |
|       19876543 |      19876543 |
|      009876543 |     009876543 |
+----------------+---------------+
Run Code Online (Sandbox Code Playgroud)

我正在使用下面的代码,但它对我不起作用。

SELECT PhoneNo, REPLACE(LTRIM(REPLACE(PhoneNo,'0',' ')),' ','0') as NewPhoneNo 
FROM tblPhone WITH(NOLOCK) 
Run Code Online (Sandbox Code Playgroud)

我正在 SQL Server 中寻找一种解决方案来删除尾随 0 而无需创建任何函数。

sql t-sql sql-server

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

如何正确使用动态SQL进行批量插入?

我有一个存储过程,例如:

CREATE PROCEDURE [dbo].[sp_writeBulk] 
    @usersID            NVARCHAR(30)
   ,@fileName           NVARCHAR(50)
   ,@nameMeasuringPoint NVARCHAR(30)
   ,@filesID            NVARCHAR(30)
   ,@filePath           NVARCHAR(1000)
AS
BEGIN
    SET NOCOUNT ON;

    BEGIN TRANSACTION
    DECLARE
         @timestamp DATETIME2(3) = SYSDATETIME()
        ,@nameMeasuringPointID INT
        ,@sql_select NVARCHAR(1000)
        ,@sql_insert NVARCHAR(1000)

    IF OBJECT_ID(N'tempdb..#tmp') IS NOT NULL
    BEGIN
        DROP TABLE #tmp
    END

    CREATE TABLE #tmp
    (
        A VARCHAR(30)
       ,B VARCHAR(30)
       ,C VARCHAR(30)
    )

    SET @sql_insert = N'BULK INSERT #tmp
            FROM @filePath
            WITH
            (
                FIELDTERMINATOR = '';'',
                ROWTERMINATOR = ''\n'',
                ROWS_PER_BATCH = 10000, 
                TABLOCK
            )'

    EXEC sp_executesql @sql_insert,
        N'@filePath NVARCHAR(1000)', @filePath; …
Run Code Online (Sandbox Code Playgroud)

sql t-sql database sql-server bulkinsert

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