标签: t-sql

复杂查询中的执行顺序

我知道简单查询的查询执行顺序。

但是,我对理解此查询中的确切执行顺序感到困惑:

select 
      M.DateKey  As DateKey ,
      PersonnelCode As PersonnelCode,
      Isnull((select top 1 BranchCode 
                  from [Financial].[viwPersonnelLocation]
              where PersonnelCode = p.PersonnelCode and DateKey <= M.DateKey 
                  order by DateKey desc)
                  ,p.BranchCode) As BranchCode,

          Isnull((select top 1 CertficateCode
                   from [Financial].[viwPersonnelEducation]
                   where PersonnelCode = p.PersonnelCode and DateKey <= M.DateKey 
                   order by DateKey desc)
                   ,p.Educationcode) As Educationcode

    from (select DateKey,MonthOfYearKey,EDATE 
          from [Common].[DimTime] 
          where LastDayOfMonthKey = 1) M

                Inner Join 

               [Financial].[viwPersonnelInfo] As P  
                   on m.DateKey >= p.DateOfEmployeement
    where (m.DateKey <= p.DateOfLeave) or (p.DateOfLeave='' or p.DateOfLeave is …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql

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

不精确的查询带来不同的结果

我从 Excel 粘贴了一个公式并粘贴到 SQL Server Management Studio。

一旦我执行它,我得到一个意想不到的结果:

SELECT (((10320238-2092189)/2092189)*100.0)/4.0 --returns 75.000000
Run Code Online (Sandbox Code Playgroud)

但是在对查询中的每个值添加精度后,它返回正确的结果:

SELECT (((10320238.0-2092189.0)/2092189.0)*100.0)/4.0 --returns 98.31866289250000
Run Code Online (Sandbox Code Playgroud)

为什么第一个查询不会带来 98% 的结果?的内部数据类型是10320238什么?是integer吗?

发动机是

Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64) 
    Oct 20 2015 15:36:27 
    Copyright (c) Microsoft Corporation
    Standard Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2012

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

按父级对没有共同组的每 X 行求和

试图按父项对没有共同组的每 X 行求和

declare @temp table(Row_ID int, amt DECIMAL(18,2))
insert into @temp values(1, 20)
insert into @temp values(2, 24)
insert into @temp values(3, 20)
insert into @temp values(4, 15)
insert into @temp values(5, 15)
Run Code Online (Sandbox Code Playgroud)

如果 X 行是 2,那么所需的结果是对 2 行求和并将总数放在行旁边。所以前 2 行总计为 44 ,接下来的 2 行为 35 ,剩下的 1 行总计为 15

Row_ID  amt     tot
1       20.00    44.00
2       24.00    44.00
3       20.00    35.00
4       15.00    35.00
5       15.00    15.00
Run Code Online (Sandbox Code Playgroud)

如果 X 行是 3,那么所需的结果

Row_ID  amt     tot
1       20.00    64.00
2 …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2016

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

连接表名每天都在变化的表

我需要一些帮助来弄清楚如何将表连接到我的查询中。表名每天都在更改,因为表名中使用了日期,而旧表因不再需要而被删除。

我的查询查找在数据库中有数据并且正在处理的“扫描”(因为缺少更好的词)。

我目前的查询是:

USE RetinaCSDatabase
SELECT S.ScanID [Scan ID], S.PolicyName [Scan], DATEADD(hh, +2, S.StartTime) [Scan Start], A.AssetName [Scanner], COUNT(AIPS.AssetIPID) [Hosts], S.TransactionGroup [Transaction Group ID]
FROM Scan S (NOLOCK)
LEFT JOIN Scanner SC (NOLOCK) ON S.ScannerID = SC.ScannerID
LEFT JOIN Asset A (NOLOCK) ON SC.AssetID = A.AssetID
LEFT JOIN Asset_IP_Scan AIPS (NOLOCK) ON S.ScanID = AIPS.ScanID
WHERE S.ProcessStatus < 2
GROUP BY S.ScanID, S.PolicyName, S.StartTime, A.AssetName, S.TransactionGroup
ORDER BY S.StartTime ASC, S.PolicyName ASC, A.AssetName ASC
Run Code Online (Sandbox Code Playgroud)

我需要加入的是包含仍需要处理的数据的表。这些表以名称“evt_scan_”开头,然后是日期。因此,例如,完整的表名将是“evt_scan_20171222”。2017 年 12 月 22 日执行的扫描数据将在表“evt_scan_20171222”中包含数据,并且可能在接下来的几天表“evt_scan_20171223”中包含数据。所以,我首先需要我的查询来检查表是否存在,然后加入它进行计数并检查接下来的天表是否存在,加入它进行另一个计数并将 …

sql-server-2008 sql-server t-sql

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

在创建查询时需要帮助

我有一个包含以下数据的表格。

columnA  columnB
ONE      value 1
ONE      value 2
ONE      value 3
TWO      value 1
TWO      value 2
THREE    value 1
Run Code Online (Sandbox Code Playgroud)

需要帮助创建下面给出的查询

COLUMN X   COLUMN Y
ONE         value 1, value 2, value 3
TWO         value 1, value 2
THREE       value 1
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql

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

根据SQL C#中的条件增加每一行

我有一个 textBox 的值为 100,我想在 stock_out 列中增加该值,但只有直到 stock_out 列等于 stock_in 列,如果第一行值是 40 比第一行 stock_out 应该从 100 增加 10 比100(90) 的剩余值应在其下方的行中递增,然后在其下方的行中递增,直到需要为止(直到 100 为 0)。项目按 Item_Name 和 Bill No asc 排序。

Bill No   Item_Name   Stock_in  Stock_out  stock_in_hand
1          chicken       50        40           10
2          chicken       40         0           40
5          chicken       60        10           50
6          chicken       100       20           80
3          fish          100       30           70
4          fish          20        20            0
Run Code Online (Sandbox Code Playgroud)

要得到的结果。

Bill No   Item_Name   Stock_in  Stock_out  stock_in_hand
1          chicken       50        50           0
2          chicken       40        40 …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2014

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

如何确保数据不会插入到数据已经存在的表中?

我创建了一个查询,我想将结果插入到另一个表中。它将每天作为作业运行,导入的数据仍将保留在结果集中。如果数据已存在于目标表中,我不希望导入数据。查询如下所示:

WITH cteUniquePages
(
CorrelationID,
Title,
URL,
HitDate,
TotalVisitsOnDate,
DontUseThisDate)
AS
(
    SELECT DISTINCT
    CorrelationID,
    Title, 
    URL,
    HitDate,
    COUNT(HitDate) OVER (PARTITION BY URL, HitDate) 'TotalVisitsOnDate',
    CAST(LogTime AS date) 'DontUseThisDate'
    FROM
        (SELECT
        CorrelationId,
        UserLogin,
        LogTime,
        Title,
        CONCAT(
            (CASE 
                WHEN WebUrl <> '' THEN CONCAT(ServerUrl,'/') ELSE ServerUrl END), 
            WebUrl,DocumentPath) 'URL',
        CONCAT(
            CASE
                WHEN (LEN(DATEPART(day,LogTime)))=1 THEN CONCAT('0',DATEPART(day,LogTime)) END,
            CASE
                WHEN (LEN(DATEPART(day,LogTime)))=2 THEN (DATEPART(day,LogTime)) END,'-', 
            CASE 
                WHEN (LEN(DATEPART(month,LogTime)))=1 THEN CONCAT('0',DATEPART(month,LogTime)) END,
            CASE
                WHEN (LEN(DATEPART(month,LogTime)))=2 THEN (DATEPART(month,LogTime)) END,
            '-', DATEPART(year,LogTime)) 'HitDate'
        FROM WSS_Logging.dbo.RequestUsage
        WHERE UserLogin …
Run Code Online (Sandbox Code Playgroud)

sql-server insert t-sql

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

在 WHERE 子句中更改运算符时,简单的递归 CTE 会爆炸

正如标题所述,我有一个递归 CTE,当我更改 WHERE 子句中的运算符时,即使只有两行数据,它也会爆炸。

CREATE TABLE #Recursion
(Parent varchar(10), Child varchar(10), TopDate datetime)


INSERT INTO #Recursion (Parent, Child, TopDate)
VALUES
('00003137', '00003137', '2018-08-31'),
('04536347', '00003137', '2017-02-28'),
('05458040', '05458040', '9999-12-31'),
('00269705',' 05458040',' 9999-12-31')

;WITH 
Parent AS
  ( SELECT parent
     , child
     , 1 as sort
     , TopDate
 FROM #Recursion 
WHERE parent = child
 UNION ALL
   SELECT s.parent
        , d.child
        , d.sort + 1
        , s.TopDate
 FROM Parent as d
 JOIN #Recursion s
   ON s.child= d.parent
WHERE s.TopDate < d.TopDate
)

  SELECT …
Run Code Online (Sandbox Code Playgroud)

sql-server t-sql sql-server-2012

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

计算数字总和

我有一列包含数字:

Value
-----
123
452
021
111
...
Run Code Online (Sandbox Code Playgroud)

我想得到每个值的数字之和。

答案应该看起来像

Value  SumValue
-----  --------
123    6
452    11
021    3
111    3
...    ...  
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

我试过这个:

select value
     , case
           when len(value) = 2 then convert(int, left(value, 1))
                                  + convert(int, right(value, 1))
           when len(value) = 3 then convert(int, substring(convert(varchar(1), value), 1,1))
                                  + convert(int, substring(convert(varchar(1), value), 2,1))
                                  + convert(int, substring(convert(varchar(1), value), 3,1))
           else value
       end as SumNum
from get_number (000, 999);
Run Code Online (Sandbox Code Playgroud)

当我达到三位数时,它无法正确计算,在我看来必须有更好的解决方案。

sql-server t-sql

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

为什么 dbo 是 Microsoft SQL Server 中唯一的授予者?

我不明白为什么 dbo 是 SQL Server 中唯一的授予者?还是我错了?

我的意思如下:无论我当前以哪个用户登录 SQL Server Management Studio,当我转到 Securables 下的数据库属性并授予用户一些权限并保存它并返回到 Securables 时:dbo 是显示为这些权限的授予者,这些权限是我之前授予的,而不是当前登录的用户。

为什么会这样?

在哪种情况下,我可以将 dbo 以外的其他用户视为授权人?

谢谢

sql-server permissions t-sql

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