我想写一个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) 我想显示一些数据,我的要求是重复的值不应显示在相邻的位置。现在表中的数据是按这个顺序排列的
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) 我有两个表,我想要两个表中的所有数据。如果表具有匹配的 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)
生产 …
我试图按如下方式获取数据,
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
我的表中有一行第一列日期时间类型:
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 语句来过滤过去 5 年的数据,我添加了下面的 where 子句,这将使我从今天起正好 5 年。
我想问如何改进此报表以包含第 5 年的所有数据。
例如,如果今天运行,则数据不会来自 16/11/2016,而是来自 01/01/2016。
其中语句:
WHERE CreatedDate > DATEADD(YEAR,-5,GETDATE())
Run Code Online (Sandbox Code Playgroud) 我想获取最近 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)
如果有的话,请指出更好(更优雅)的解决方案。
我有一张由以下内容组成的表格:
| 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) 我有一个旧的 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 而无需创建任何函数。
我有一个存储过程,例如:
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-server ×10
t-sql ×10
sql ×9
bulkinsert ×1
database ×1
date ×1
datetime ×1
select ×1
where-clause ×1