AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / user-114915

SQLserving's questions

Martin Hope
SQLserving
Asked: 2020-11-19 10:02:55 +0800 CST

带分区的递归 CTE

  • 0

我在 MS SQL SERVER 2014 中有一个这样的表:

ID|Race|Lap  
1 |21  |11  
2 |21  |NULL
3 |21  |NULL  
4 |21  |NULL  
5 |29  |65  
6 |29  |NULL  
7 |29  |NULL  
8 |29  |NULL 

我正在尝试通过根据第一个值向其添加 1 来填充 Lap 列。分区基于 Race 列。这样的结果将是最终结果:

ID|Race|Lap  
1 |21  |11  
2 |21  |12
3 |21  |13  
4 |21  |14  
5 |29  |65  
6 |29  |66  
7 |29  |67  
8 |29  |68  

可能还有其他方法可以做到这一点,但我宁愿坚持使用递归 CTE。有没有办法做到这一点?

sql-server recursive
  • 3 个回答
  • 315 Views
Martin Hope
SQLserving
Asked: 2020-05-07 07:22:41 +0800 CST

将多个文件上传到 SQL Server,而无需访问 Server Box

  • 0

我正在尝试创建一个进程,该进程将定期将多个 csv 文件批量上传到 SQL Server 中的各个表中。我遇到的问题是这些文件不在同一台服务器上。

我可以使用批量上传命令从 SQL 服务器框上的文件夹上传文件,但不能从位于不同服务器上的共享驱动器上传文件。有多个人将运行此过程,因此它可能不可行,因为并非所有人都能获得对 SQL 服务器框的这种访问权限。

有没有办法以同样的效率和速度完成这个任务?
我曾想过发送 csv 文件中的每一行,但这些文件很大,需要很长时间
才能完成这项工作。
SSIS 会更少或更多或同样有效吗?

ssis sql-server-2014
  • 1 个回答
  • 138 Views
Martin Hope
SQLserving
Asked: 2019-10-09 09:37:18 +0800 CST

根据 ID 将英里数限制到千分之一

  • 5

我在 sql server 2014 中有一个这样的表:

ID | Start_mile|End_mile  
1  |5.23       |7.464  
2  |2.333      |6.124 

我想要做的是将英里分成每个 ID 的千分之一,如下所示:

ID |start_mile|end_mile  
1  |5.230     |5.231  
1  |5.231     |5.232  
1  |5.232     |5.233  
....  
1  |7.463     |7.464  
...

关于如何去做的任何想法?我试图远离 Cursors,除非这是唯一的方法。

我已经能够将这个查询放在一起,但不确定如何将它与我的 ID 和英里限制结合起来,以便它在没有声明的 From 和 To 变量的情况下运行整个表:

DECLARE @from decimal(15, 3) = 0.980;  
DECLARE @to decimal(15, 3) = 1.024;  

;WITH cte AS  
    (SELECT @from AS Value  
     UNION ALL  
     SELECT CONVERT(decimal(15, 3), Value + 0.001)  
     FROM cte  
     WHERE Value < @to)  
SELECT *  
FROM cte  
option (maxrecursion 0) 
sql-server
  • 3 个回答
  • 376 Views
Martin Hope
SQLserving
Asked: 2019-05-09 07:13:42 +0800 CST

SQL Server 中的重叠和间隙分组

  • 1

我试图在我的数据中找到差距,然后对它们进行分组。我正在使用的表如下所示:

runid|year |road|start   |end     
01010|  9  |2   |0.000   |0.585    
01100|  9  |2   |0.585   |4.980    
01100|  9  |2   |4.980   |7.777  
01100|  9  |2   |7.777   |11.857   
01100|  9  |2   |11.857  |13.274   
01100|  9  |2   |15.235  |21.021  
01100|  9  |2   |21.021  |25.333  
01100|  9  |3   |0.000   |7.777  
01100|  9  |3   |7.777   |13.274  
01100|  9  |3   |13.274  |25.333 
...

我希望能够创建一个新列来标识这样的组:

runid|year |road|start   |end    |rn    
01010|  9  |2   |0.000   |0.585  |1  
01100|  9  |2   |0.585   |4.980  |1  
01100|  9  |2   |4.980   |7.777  |1
01100|  9  |2   |7.777   |11.857 |1  
01100|  9  |2   |11.857  |13.274 |1  
01100|  9  |2   |15.235  |21.021 |2
01100|  9  |2   |21.021  |25.333 |2 
01100|  9  |3   |0.000   |7.777  |1
01100|  9  |3   |7.777   |13.274 |1 
01100|  9  |3   |13.274  |25.333 |1  
...  

如您所见,某些部分数据的起始端是同步的,然后在 13.274 到 15.235 之间存在间隙,这是您切换新列的位置(rn)
注意:该表是大表的快照有许多 runid、years、roads 和相关的起点和终点

到目前为止,我已经做了这样的事情:

with cte as (  
select distinct runid,year,road,start,end, LAG(end) over (partition by runid,year,road order by start) rn from dbo.runners
)
select *,CASE WHEN rn <> start then 1 when rn is null then 2 else 0 end chk from cte order by runid,year,road,start   

这给了我这个:

runid|year |road|start   |end    |rn    |chk   
01010|  9  |2   |0.000   |0.585  |NULL  |2  
01100|  9  |2   |0.585   |4.980  |0.585 |0  
01100|  9  |2   |4.980   |7.777  |4.980 |0  
01100|  9  |2   |7.777   |11.857 |7.777 |0  
01100|  9  |2   |11.857  |13.274 |11.857|0    
01100|  9  |2   |15.235  |21.021 |13.274|1  
01100|  9  |2   |21.021  |25.333 |21.021|0   
01100|  9  |3   |0.000   |7.777  |NULL  |2  
01100|  9  |3   |7.777   |13.274 |7.777 |0  
01100|  9  |3   |13.274  |25.333 |13.274|0    
... 

我不确定如何为我的分区中的每个组获得更像一个 RANK 列。

测试链接在这里

sql-server sql-server-2014
  • 1 个回答
  • 176 Views
Martin Hope
SQLserving
Asked: 2018-12-08 12:47:44 +0800 CST

将日期与条件匹配并在表中过滤

  • 1

所以我有一张这样的桌子

id | date1   |date2   |value  
1  | 1/1/2014|1/1/2004|100  
1  | 1/1/2014|1/1/2004|100  
1  | 1/1/2014|1/1/2009|200  
1  | 1/1/2014|1/1/2009|200   
1  | 1/1/2014|1/1/2016|300  
1  | 1/1/2015|1/1/2004|100  
1  | 1/1/2015|1/1/2004|100  
1  | 1/1/2015|1/1/2009|200   
1  | 1/1/2015|1/1/2009|200    
1  | 1/1/2015|1/1/2016|300   
1  | 1/1/2017|1/1/2004|100  
1  | 1/1/2017|1/1/2004|100  
1  | 1/1/2017|1/1/2009|200  
1  | 1/1/2017|1/1/2009|200   
1  | 1/1/2017|1/1/2016|300 

注意:Value col 值可以是随机的

如何通过各种 ID 获取 date1>=date2 的行。

本质上,如果 date1 是 2014 那么我只想得到 date1-date2 最小但不是负数的行。

示例表的结果如下所示:

id | date1   |date2   |value  
1  | 1/1/2014|1/1/2009|200  
1  | 1/1/2015|1/1/2009|200  
1  | 1/1/2017|1/1/2016|300

我希望我解释得很好,如果没有,请随时提问。

我正在使用 MS SQL SERVER 2014

到目前为止我已经尝试过:

select id,date1,min(date2) over (partition by id,date1 order by id, date1) date2, value   
from tblA

这给了我:

id | date1   |date2   |value  
1  | 1/1/2014|1/1/2004|100  
1  | 1/1/2014|1/1/2004|100  
1  | 1/1/2014|1/1/2004|200  
1  | 1/1/2014|1/1/2004|200   
1  | 1/1/2014|1/1/2004|300  
1  | 1/1/2015|1/1/2004|100  
1  | 1/1/2015|1/1/2004|100  
1  | 1/1/2015|1/1/2004|200   
1  | 1/1/2015|1/1/2004|200    
1  | 1/1/2015|1/1/2004|300   
1  | 1/1/2017|1/1/2004|100  
1  | 1/1/2017|1/1/2004|100  
1  | 1/1/2017|1/1/2004|200  
1  | 1/1/2017|1/1/2004|200   
1  | 1/1/2017|1/1/2004|300 

这是摆弄表格的链接

sql-server t-sql
  • 1 个回答
  • 68 Views
Martin Hope
SQLserving
Asked: 2018-07-13 05:33:22 +0800 CST

通过 Cursor SQL Server 获取两个或更多列值

  • 0

我有两个这样的表:
表实验(我现在只使用一个 roadID (rID))

rID | latBegin |longBegin |latEnd   |longEnd  
041 | 23.875464|-80.456798|30.549879|-83.5465521  
041 | 33.776563|-81.157526|33.248261|-81.2468425 

对于上述每一行,我希望光标获取 rID、latBegin、longBegin 并在Table ExperimentDetails中检查 lat 和 long 的距离

rID | lat      |long      |temp |direction|tension    
041 | 33.665632|-81.137952|56.23|L        |54.54      
041 | 23.245632|-80.127952|56.23|L        |23.54  
041 | 23.454555|-80.232456|66.23|L        |13.54  
041 | 23.568763|-80.346586|26.23|L        |63.54  
041 | 23.796545|-80.446586|86.23|L        |83.54   
041 | 23.996545|-80.946586|96.23|L        |22.54   

查询的步骤是:
第 1 步:从 Table Experiment 中获取特定 rID 的 latBegin 和 longBegin
第 2 步:转到 ExperimentDetails 并运行此计算以获取 Details 表中每个 lat 和 long 的距离差

Round(Sqrt(POWER((Abs(lat - @latBegin)),2) + POWER((Abs(long - @longBegin)),2)) * 3958.73926185, 4) * 1000  

第 3 步:在详细信息表中获取此新关联列的最小值
第 4 步:获取该最小值的关联温度、方向和张力值并将其放入新表中(尚未完成>需要帮助)
第 5 步:从最小值获取前 30 英尺或 360 英寸的温度、张力平均值并将其放在另一个表中(列:rID、latBegin、longBegin、avgTension、avgtemp 尚未完成>需要帮助)

到目前为止,这是我的代码:

      DECLARE @rID int,@latBegin decimal(15,10),@longBegin decimal(15,10),@minV decimal(15,10),@temp decimal(15,10)

    DECLARE MY_CURSOR CURSOR   
      LOCAL STATIC READ_ONLY FORWARD_ONLY  
    FOR   
    SELECT DISTINCT rid,latbeg,longbeg   
    FROM dbo.Experiment  
    WHERE rID='041'  

    OPEN MY_CURSOR  
    FETCH NEXT FROM MY_CURSOR INTO @rID,@latBegin,@longBegin  
    WHILE @@FETCH_STATUS = 0  
    BEGIN   


        SELECT @minV=Min(Round(Sqrt(POWER((Abs(lat - @latBegin)),2) + POWER((Abs(long - @longBegin)),2)) * 3958.73926185, 4) * 1000,latitude) over (Partition by rID Order by rID)  
, @temp=temp

        FROM dbo.ExperimentDetails  
            WHERE rid='041'  

        Insert into dbo.Test(rid,lat,lon,min,temp) values   (@rid,@latBegin,@longBegin,@minV,@temp)  



        FETCH NEXT FROM MY_CURSOR INTO @rID,@latBegin,@longBegin  
    END  

    CLOSE MY_CURSOR  
    DEALLOCATE MY_CURSOR

测试表如下所示:

rID|lat      |long      |min |temp  
041|23.875464|-80.456798|12.1|96.23
041|33.776563|-81.157526|11.0|96.23

最后一行重复临时数据,不正确

它应该如下所示:

rID|lat      |long      |min |temp  
041|23.875464|-80.456798|12.1|83.54
041|33.776563|-81.157526|11.0|54.54

我已经提供了尽可能多的信息,但是如果您需要更多信息,请询问,将不胜感激,从昨天开始就一直在努力解决这个问题。目前,除了@minV 之外,我还试图引入温度、方向和张力,但它不允许我这样做

对于第 5 步:对于详细信息表,光标中的计算理论上如下所示:

rID |lat       |long      |temp |DISTDIFF  
041 | 23.245632|-80.127952|56.23|372.12    
041 | 23.454555|-80.232456|66.23|300.22   
041 | 23.568763|-80.346586|26.23|50.48   
041 | 23.796545|-80.446586|86.23|12.10

然后在插入时检查最小值,即 12.10 并插入与该行相关的值。
对于第 5 步,我需要在最小值之前而不是之后找到最接近 360 的值(之后可能还有更接近的其他值),在本例中为 372.12,然后取 temp 的平均值,如下所示:

rID |minlat    |minlong   |lastlat  |lastlong  |Avgtemp  
041 | 23.796545|-80.446586|23.245632|-80.127952|58.73 

使用 SQL Server 2014

sql-server cursors
  • 1 个回答
  • 5002 Views
Martin Hope
SQLserving
Asked: 2018-03-06 07:25:53 +0800 CST

创建/更新从同一服务器上的生产数据库及时复制的测试数据库

  • 0

我想创建一个测试环境数据库,每月或根据需要从生产数据库中刷新(它们都在同一台服务器上)。这不仅仅是数据刷新,因为如果我对模式进行更改,我希望它也能更新。最好的方法是什么?我已经尝试了一些 powershell 命令,但其中大部分都是像这样
的一次性重复 。如果 powershell 是可行的方法,我希望它查找该数据库,如果它存在,我希望它进行更新。

sql-server sql-server-2014
  • 1 个回答
  • 197 Views
Martin Hope
SQLserving
Asked: 2017-12-15 08:15:19 +0800 CST

基于特定年份的前 5 年数据

  • 1

我有一张这样的桌子:

ID|Date    |Name|Score  
1 |1/1/2014|Erin|20.2  
2 |6/3/2014|Erin|21.2  
3 |7/2/2015|Emil|34.2    
4 |1/1/2016|Erin|20.2  
5 |2/2/2011|Paul|20.2  
6 |1/1/2012|John|54.2  
7 |1/1/2017|John|54.2  
8 |12/31/2016|Erin|23.2

我希望根据我提供的年份将数据返回 5 年。
我正在使用这个:

select * from tblStdnt where date > DATEADD(Year,DATEDIFF(year,0, '2016')- 5, 0) 

但这给了我从 2017 年开始的数据。我该如何解决这个问题?有任何想法吗?

它应该给我:

2011年至2016年的所有数据(5年期间,不分月日)

更新
DBFiddle 链接

sql-server sql-server-2014
  • 4 个回答
  • 2081 Views
Martin Hope
SQLserving
Asked: 2017-12-07 06:37:13 +0800 CST

长数据动态转换为多列宽数据

  • 0

我正在尝试转换长数据:

ID|SchoolID|Section|RepScore|SportsScore|PartyScore  
1 |20      |1      |23.2    |70.2       |42.3          
2 |20      |6      |65.2    |75.8       |52.3        
3 |20      |7      |77.2    |72.2       |66.3       
4 |21      |10     |13.2    |40.2       |72.3         
5 |21      |11     |25.2    |55.8       |72.3         
6 |21      |12     |37.2    |62.2       |76.3       

到宽数据(我只使用前三行来保持简短):

SchoolID|RpScr1|RpScr6|RpScr7|SprtScr1|SprtScr6|SprtScr7|Prty1|Prty6|Prty7  
20      |23.2  |65.2  |77.2  |70.2    |75.8    |72.2    |42.3 |52.3 |66.3 

我试过这个:

DECLARE @cols VARCHAR(1000)
DECLARE @cols2 VARCHAR(1000)
DECLARE @cols3 VARCHAR(1000)
DECLARE @sqlquery VARCHAR(2000)
SELECT  @cols = STUFF(( SELECT distinct  '], [a' + cast([Section] as varchar)
                        FROM [dbo].[SchoolData] FOR XML PATH('') ), 1, 2, '') + ']'
SELECT  @cols2 = STUFF(( SELECT distinct  '], [b' + cast([Section] as varchar)
                        FROM [dbo].[SchoolData] FOR XML PATH('') ), 1, 2, '') + ']'
SELECT  @cols3 = STUFF(( SELECT distinct  '], [c' + cast([Section] as varchar)
                        FROM [dbo].[SchoolData] FOR XML PATH('') ), 1, 2, '') + ']'
SET @sqlquery = 'SELECT * FROM
      (SELECT z.Section,z.RepScore,z.SportsScore,z.PartyScore
       FROM [dbo].[SchoolData] z) base
       PIVOT (Max(RepScore) FOR [Section] IN (' + @cols + ')) AS finalpivot
       PIVOT (Max(SportsScore) FOR [Section] IN (' + @cols + ')) AS finalpivot2
       PIVOT (Max(PartyScore) FOR [Section] IN (' + @cols + ')) AS finalpivot3'


EXECUTE ( @sqlquery )

这是我得到的错误:Msg 8114, Level 16, State 1, Line 7 将数据类型 nvarchar 转换为 int 时出错。消息 473,级别 16,状态 1,第 7 行 PIVOT 运算符中提供了不正确的值“a9”。消息 207,级别 16,状态 1,第 8 行 列名“部分”无效。

当我尝试这样的一个时:

DECLARE @cols VARCHAR(1000)  
DECLARE @sqlquery VARCHAR(2000)  
    SELECT  @cols = STUFF(( SELECT distinct  '], [a' + cast([Section] as varchar)  
                            FROM [dbo].[SchoolData] FOR XML PATH('') ), 1, 2, '') + ']'    
SET @sqlquery = 'SELECT * FROM  
          (SELECT z.Section,z.RepScore,z.SportsScore,z.PartyScore  
           FROM [dbo].[SchoolData] z) base  
           PIVOT (Max(RepScore) FOR [Section] IN (' + @cols + ')) AS   finalpivot' 

它仅适用于一列,并给出类似 [1]、[6]、[7] 的列名称。但它不适用于我需要的多个列。有任何想法吗?

sql-server xml
  • 3 个回答
  • 3925 Views
Martin Hope
SQLserving
Asked: 2017-11-14 08:54:14 +0800 CST

连接具有复杂需求的多个表

  • 2

我有 3 个这样的表:

大师:PK:SPID

SPID| ProjectID|DesignMix|ProjectType|Date    |ContentType  
1   |123      |AB-12    |New Proj   |1/1/2015|CT_1  
2   |145      |AR-13    |New Proj   |2/1/2015|CT_2  
3   |423      |AB-13    |New Proj   |1/1/2015|CT_3 

详情:PK:有一个Identity列ID

SPID|ProjectID|Length|TenthReading  
1   |123      |0.1   |43  
1   |123      |0.1   |45  
1   |123      |0.1   |46  
1   |123      |0.1   |55  
1   |123      |0.1   |59   
1   |123      |0.060 |120  
2   |145      |0.1   |130  
2   |145      |0.1   |45  
2   |145      |0.1   |46  
2   |145      |0.1   |55  
2   |145      |0.1   |59   
2   |145      |0.080 |140   
3   |423      |0.077 |43  
3   |423      |0.1   |45  
3   |423      |0.1   |46  
3   |423      |0.1   |155  
3   |423      |0.1   |59   
3   |423      |0.080 |99     

MaterialType:PK是一个Identity列ID

ProjectID|DesignMix|Material  |Perc|ContentType  
123      |AB-12    |Concrete  |20  |CT_1  
123      |AB-12    |Limestone |60  |CT_1  
123      |AB-15    |Concrete  |20  |CT_1  
145      |AR-13    |Concrete  |20  |CT_2
145      |AR-13    |Concrete  |70  |CT_2
423      |AB-13    |Limestone |80  |CT_3 

查询规范如下:
1. 根据 SPID连接主表和明细表 2.
根据 ProjectID 和 DesignMix 连接主表和 Material 表
3. 如果特定的 projectID 和 DesignMix 在 MaterialTable 中有多个行,例如。ID=123 的混凝土和石灰石,则应将其与名称“混合”合并在一起
4. 主表中的所有数据以及详细信息和材料表中的相关数据,即首选左连接,尤其是在主表和材料之间
5. 日期应为年份2015 年和项目类型应为“新项目”

结果查询应该给我这样的东西:

ContentType|Material |CountLength|SumLength|AvgR |MinR|MaxR|CountRgreater95|SumLengthgreater95  
CT_1       |Mixed    |6          |0.56     |61.33|43  |120 |1              |0.06  
CT_2       |Concrete |6          |0.58     |79.16|45  |140 |2              |0.18  
CT_3       |Limestone|6          |0.557    |74.5 |43  |155 |2              |0.18 

这是一个提供测试表定义的DBFiddle 链接

这是我到目前为止写的查询,但没有给我正确的结果:

Select
Distinct
z.ContentType

,z.Material
,sum(CountLength) over (partition by Material,ContentType order by ContentType) CountLength
,sum(SumLength) over (partition by Material,ContentType order by ContentType) SumLength
,sum(AvgR) over (partition by Material,ContentType order by ContentType) AvgR
,sum(MinR) over (partition by Material,ContentType order by ContentType)MinR
,sum(MaxR) over (partition by Material,ContentType order by ContentType)MaxR

,CountRgreater95
,SumLengthgreater95 
From
(
Select 
x.ContentType
,CountLength
,SumLength
, AvgR
,MinR
,MaxR
,x.ProjectID
,x.DesignMix
,Coalesce(y.Material,x.Material) Material
,CountRgreater95
,SumLengthgreater95
From 
(Select Distinct
c.ContentType
,CountLength
,SumLength
, AvgR
,MinR
,MaxR
,c.ProjectID
,c.DesignMix
,c.Material


,CountRgreater95
,SumLengthgreater95

from
(
select distinct a.* ,b.Material,max(b.Perc) over (partition by b.Material,b.DesignMix order by a.ProjectID) Perc from  (SELECT a.ProjectID,a.DesignMix,a.ContentType, COUNT(b.Length) AS CountLength, SUM(b.Length) AS SumLength, CONVERT(int, ROUND(AVG(CONVERT(decimal(6, 2), b.TenthReading)), 0)) AS AvgR, MIN(b.TenthReading) AS MinR, MAX(b.TenthReading) AS MaxR, c.CountRgreater95, 
        c.SumLengthgreater95
FROM            dbo.Master AS a INNER JOIN
dbo.Details AS b ON a.SPID = b.SPID INNER JOIN
(SELECT        x0.ContentType, COUNT(x.Length) AS CountRgreater95, SUM(x.Length) AS SumLengthgreater95
FROM            dbo.Master AS x0 INNER JOIN
dbo.Details AS x ON x0.SPID = x.SPID
WHERE        (x.TenthReading >= 95) AND (x0.ProjectType = 'New Proj') AND (YEAR(x0.Date) = 2015)
GROUP BY x0.ContentType) AS c ON a.ContentType = c.ContentType
WHERE        (a.ProjectType = 'New Proj') AND (YEAR(a.Date) = 2015) 
GROUP BY a.ContentType, YEAR(a.Date), c.CountRgreater95, c.SumLengthgreater95,a.ProjectID,a.DesignMix  )a inner join MaterialType b on a.ProjectID=b.ProjectID and a.DesignMix=b.DesignMix 

) c  group by c.ContentType,ProjectID,DesignMix,Material,CountLength,SumLength,CountRgreater95,SumLengthgreater95,AvgR,MinR,MaxR
)x
Left Join
(
select d.ContentType
,d.ProjectID
,d.DesignMix
,'Mixed' as Material
 ,count(ProjectID) cnt
 from
 (
Select  Distinct
c.ContentType
,CountLength
,SumLength
, AvgR
,MinR
,MaxR
,c.ProjectID
,c.DesignMix
,c.Material
,CountRgreater95
,SumLengthgreater95

from
(
select distinct a.* ,b.Material,max(b.Perc) over (partition by b.Material,b.DesignMix order by a.ProjectID) Perc from  (SELECT a.ProjectID,a.DesignMix,a.ContentType, COUNT(b.Length) AS CountLength, SUM(b.Length) AS SumLength, CONVERT(int, ROUND(AVG(CONVERT(decimal(6, 2), b.TenthReading)), 0)) AS AvgR, MIN(b.TenthReading) AS MinR, MAX(b.TenthReading) AS MaxR, c.CountRgreater95, 
        c.SumLengthgreater95
FROM            dbo.Master AS a INNER JOIN
dbo.Details AS b ON a.SPID = b.SPID INNER JOIN
(SELECT        x0.ContentType,x1.Material, COUNT(x.Length) AS CountRgreater95, SUM(x.Length) AS SumLengthgreater95
FROM            dbo.Master AS x0 INNER JOIN
dbo.Details AS x ON x0.SPID = x.SPID left Join
MaterialType x1 on x0.ProjectID=x1.ProjectID and x0.DesignMix=x1.DesignMix
WHERE        (x.TenthReading >= 95) AND (x0.ProjectType = 'New Proj') AND (YEAR(x0.Date) = 2015)
GROUP BY x0.ContentType,x1.Material) AS c ON a.ContentType = c.ContentType
WHERE        (a.ProjectType = 'New Proj') AND (YEAR(a.Date) = 2015) 
GROUP BY a.ContentType, YEAR(a.Date), c.CountRgreater95, c.SumLengthgreater95,a.ProjectID,a.DesignMix  )a inner join MaterialType b on a.ProjectID=b.ProjectID and a.DesignMix=b.DesignMix 

) c  group by c.ContentType,ProjectID,DesignMix,Material,CountLength,SumLength,CountRgreater95,SumLengthgreater95,AvgR,MinR,MaxR
)d
group by d.ContentType,ProjectID,DesignMix 
Having count(ProjectID)>1
)y on x.ContentType=y.ContentType and x.ProjectID=y.ProjectID and x.DesignMix=y.DesignMix
)z

检查 DBFiddle 链接以查看我的结果

sql-server join
  • 2 个回答
  • 1167 Views
Martin Hope
SQLserving
Asked: 2017-11-03 05:29:55 +0800 CST

三表多行sql连接

  • 0

我有三个这样的表:

桌旗:

此表保存跑步者信息和英里长度

ID|Name|BMP  |EMP  |Vendor  
1 |Alex|12.25|22.25|Heinz  
2 |Abby|0.00 |3.55 |Uni  
3 |Marx|5.55 |10.55|Jam 

表 RaceDetails:此表保存方向(大多数比赛有上下,在这种情况下范围切换)

ID|Dir|BMP  |EMP  
1 |U  |12.26|12.33  
1 |U  |12.33|12.47  
1 |U  |21.12|21.99  
1 |U  |22.00|22.44  
1 |U  |22.15|22.36  
2 |U  |0.00 |2.55  
2 |U  |2.55 |4.56  
2 |D  |4.56 |2.55  
2 |D  |2.55 |0.00   
3 |U  |5.55 |9.55  
3 |U  |9.55 |11.69  
3 |D  |11.69|9.55  
3 |D  |9.55 |-0.12  

表 RaceSense:

ID|BMP  |EMP  |SENSOR  
1 |12.25|20.33|1  
1 |20.33|22.25|3  
2 |0.00 |3.55 |2  
3 |5.55 |9.55 |2  
3 |9.55 |10.55|5

我正在像这样在它们之间进行连接:

Select    distinct * 
from      Runners a 
left join RaceDetails b 
on        a.ID=b.ID 
left join RaceSense c 
on        a.ID=c.ID  

这给了我 22 行,因为它复制了 Racedetails 中的数据,因为 RaceSense 表中的相同 ID 有多个行

我也试过这个:

Select    distinct * 
from      Runners a 
left join RaceDetails b 
on        a.ID=b.ID 
left join RaceSense c 
on        a.ID=c.ID 
and      (b.BMP+b.EMP)/2>=c.BMP 
and      (b.BMP+b.EMP)/2<=c.EMP  

这给了我 8 行而不是 13 行,因为一些平均值超出了 RaceSense 表的实际范围

我想要 13 行没有重复,像这样:

ID|Name  |BMP  |EMP  |VENDOR|SENSOR  
1 |Alex  |12.26|12.33|Heinz |1  
1 |Alex  |12.33|12.47|Heinz |1  
1 |Alex  |21.12|21.99|Heinz |3  
1 |Alex  |22.00|22.44|Heinz |3  
1 |Alex  |22.15|22.36|Heinz |3  
2 |Abby  |0.00 |2.55 |Uni   |2 
2 |Abby  |2.55 |4.56 |Uni   |2 
2 |Abby  |4.56 |2.55 |Uni   |2
2 |Abby  |2.55 |0.00 |Uni   |2
3 |Marx  |5.55 |9.55 |Jam   |2 
3 |Marx  |9.55 |11.69|Jam   |5  
3 |Marx  |11.69|9.55 |Jam   |5  
3 |Marx  |9.55 |-0.12|Jam   |2   

我想这样做的方式是:

1.如果 Details 表中的 BMP 和 EMP 在 The Sense 表 BMP 和 EMP 中,那就很好。
2.如果Details中的BMP或EMP在Sense表中的BMP或EMP之外,则取Details中BMP和EMP的平均值并确保它在Sense表的范围内。
3.如果平均值也超出范围那么我想将Sense表BMP和EMP扩大0.1
4.否则给我一个空值

有任何想法吗?

sql-server join
  • 1 个回答
  • 879 Views
Martin Hope
SQLserving
Asked: 2017-10-24 05:35:24 +0800 CST

插入 ID 和日期以定位 C#/VBA 应用程序的数据

  • 1

我试图让用户上传 excel 表以将数据插入 sql 数据库。当他们上传数据时,我想要一个数据网格视图来显示他们刚刚上传到数据库中的数据,并且能够根据日期回顾这些数据。

我创建了一个这样的表:

**dbo.DB_TRACK**  
V_ID Identity  
TBL_N varchar(20)  
ID  int  
ENTR_DT date  

我为其中一个数据库表编写了存储过程,如下所示:

Create Procedure dbo.Insert_Students  
(  
SName varchar(10),  
SAge varchar(10),  
SAdmit_Dt varchar(10)  
)  
    Declare @id table(id int),  
     @pk int,  
     @iSAge int,  
     @iSAdmit_Dt date  

     Set @iSAge=@SAge  
     Set @iSAdmit_Dt=Convert(Date,@SAdmit_Dt)

    BEGIN TRY  

      BEGIN TRANSACTION  

      Insert into dbo.Student(Name,Age,AdmissionDt)  
      OUTPUT INSERTED.S_ID into @id    
      Values  
      (@SName,@iSAge,@iSAdmit_Dt)  

      COMMIT TRANSACTION  

      BEGIN TRANSACTION  

      Insert into dbo.DB_TRACK (TBL_N, ID, ENTR_DT ) 
      VALUES ('dbo.Student', (Select @pk=id from @id),GETDATE)

      COMMIT TRANSACTION  

    END TRY  
    BEGIN CATCH

      IF @@TRANCOUNT > 0  
          ROLLBACK TRANSACTION  

    END CATCH

我收到错误:

“=”附近的语法不正确。

更新:
不再收到此错误(感谢 David Browne)并且能够保存 SP 但在执行 SP 时,我收到此错误:

从字符串转换日期和/或时间时转换失败。

我试过 Convert(date,GetDate()) 但它没有用

调用此存储过程的代码在 VBA 中如下所示:

Dim SName, SAge,SAdmit_DT as String  
Dim oSName, oSAge,oSAdmit_DT as ADODB.Parameter  

SName= ws.Cells(1, 11)  
SAge = ws.Cells(1, 12)  
SAdmit_DT = ws.Cells(1, 13)  

Set oSName = cmd.CreateParameter("@SName", adVarChar, adParamInput, 10, SName)  
cmd.Parameters.Append oSName  
Set oSAge = cmd.CreateParameter("@SAge", adVarChar, adParamInput, 10, SAge)  
cmd.Parameters.Append oSAge  
Set oSAdmit_DT = cmd.CreateParameter("@SAdmit_DT", adVarChar, adParamInput, 10, SAdmit_DT)  
cmd.Parameters.Append oSAdmit_DT 

cmd.Execute' This is where it errors out

我尝试删除 SAdmit_Dt 但仍然出现错误
我尝试通过 excel 传递 DATE() 但出现算术溢出错误
知道如何解决这个问题吗?还有更好的方法来做我想做的事吗?

sql-server stored-procedures
  • 1 个回答
  • 63 Views
Martin Hope
SQLserving
Asked: 2017-07-29 05:54:12 +0800 CST

表格之间的范围比较

  • 1

我有两个这样的表:

Runners:  
Name|Date    |FromDist|ToDist|RaceN  
Al  |1/1/2017|1       |9     |axe  
CC  |1/1/2017|11      |12    |axe   
Bm  |2/1/2017|6       |2     |Charity  



RaceStandards:  
RaceN  |Date    |FromDist|ToDist|Direction|Rank  
axe    |1/1/2017|1       |10    |+        |1
Charity|2/1/2017|10      |4     |-        |2

比赛标准表给出了每场比赛的方向和距离范围。跑步者表给出了每个跑步者跑的距离。
Question/Issue/What I want to do:
1. 获取方向
2. 如果它的 +,范围应该是 >=FromDist and <=ToDist; 如果是-,range应该是<=FromDist and >=ToDist
3.根据步骤1和2比较Runners FromDist和ToDist的距离范围,如果在范围内则赋值为该种族的Rank编号,否则赋值为0
4。如果 Runner 超出范围,则该值可以为零

所以最终的结果会是这样的:

Runners:  
    Name|Date    |FromDist|ToDist|RaceN   |Rank  
    Al  |1/1/2017|1       |9     |axe     |1
    CC  |1/1/2017|11      |12    |axe     |0
    Bm  |2/1/2017|6       |2     |Charity |2  

每个表中会有数百行,所以我希望它是动态的。可能会有重叠之类的东西,但我现在只需要一个先机,一旦我获得了基本代码,我就可以尝试从那里扩展。我将不胜感激任何帮助。我试着提供尽可能多的细节,如果需要更多请询问。

sql-server sql-server-2014
  • 1 个回答
  • 61 Views
Martin Hope
SQLserving
Asked: 2017-06-02 20:09:46 +0800 CST

MS Access- SQL Server 附件-Images 或 Varchar(max)

  • 0

我正在尝试将数据库从 MS Access 移动到 SQL Server 2014,并且我正在使用 SSMA 进行访问。一些表格有附件(pdf、jpg、电子邮件等)。

当我将它移动到 SQL Server 时,附件显示为文件名:
在此处输入图像描述

无论如何要从 MS Access 端或 SQL Server 端执行此操作?

我将所有文件下载到我的系统中,并考虑将名称与文件夹中的文件匹配以通过SQL将它们上传到数据库,但是在某些情况下一行有多个文件,所以基本上我不确定如何去做。

sql-server ms-access
  • 1 个回答
  • 1258 Views
Martin Hope
SQLserving
Asked: 2017-05-31 09:55:45 +0800 CST

MS-Access RANK() 函数

  • 0

我在 Access 中有一个这样的表:

ID |  Op_ID  
1  |  1  
1  |  2  
2  |  3  
3  |  4  
3  |  5  
3  |  6  

是否有一个我可以在 Access 中运行的 SELECT 查询,它会给我这样的东西?:

ID |  Count(ID)  
1  |  1  
1  |  2  
2  |  1  
3  |  1  
3  |  2  
3  |  3 

所以基本上我想要一个每次 ID 更改时循环遍历 ID 的 ID 计数。

ms-access
  • 1 个回答
  • 15937 Views
Martin Hope
SQLserving
Asked: 2017-03-21 04:26:05 +0800 CST

最佳数据上传格式

  • 1

我们自动生成的大多数文件都包含整数、小数、日期、时间,有时还包含 varchar。这是仪表数据。由于我们会将这些文件直接上传到 SQL Server 数据库,因此我们试图确定从我们的仪器自动生成最有效的文件格式。

将数据上传到 SQL Server 数据库最有效的文件格式是什么?我以为它会是文本格式,但是当我用 CSV 进行实验时,CSV 往往占用更少的空间,并且用户也更容易分析。

数据文件大小从 50K 到 250K 不等。只有几个 MB 范围。

我正在创建一个将数据上传到数据库的应用程序。我们将 LabView 用于我们的仪器数据,这就是我们想要标准化文件格式的地方。

我倾向于CSV。我对 XML 没有太多经验,所以我可能会认为,如果优势远远超过 CSV。我只关心质量控制方面的可读性。在某些情况下,用户可能希望在上传之前更改或修复某些数据。速度也很重要,但对于如此小的文件大小,我并不太担心。

sql-server csv
  • 1 个回答
  • 1663 Views
Martin Hope
SQLserving
Asked: 2017-02-11 10:42:27 +0800 CST

两张表,一个外键,两个主键

  • 0

假设有两个表:
Student:
StudentID(Primary Key)
Name

StudentTeams:
StudentID(Primary Key, Foreign Key)
TeamName

StudentTeams 表中的 StudentID 引用 Student 表的主键。就关系完整性而言,这种结构的优缺点是什么?

database-design foreign-key
  • 2 个回答
  • 1451 Views
Martin Hope
SQLserving
Asked: 2017-01-27 11:35:11 +0800 CST

在 SQL Server 中为特殊字段创建范围

  • 4

我有两列看起来像这样:

开始_发布结束_发布
---------- ----------
102+20.45 153+19.22
120+21.25 220+25.30
……

我想为每一列引入一个约束:

  • Start_Pos
    最小范围:100+50.30
    最大范围:150+20.65
  • End_Pos
    最小范围:150+60.30
    最大范围:500+20.75

所有值均以英尺为单位并遵循特殊格式。这是一个建筑惯例,我不是专家,但据我所知,1+00 就是 100 英尺。本质上,采用上述 100+50.30 到 150+20.65 的范围意味着 4970 英尺的距离。我所做的只是删除加号并减去两个数字。希望这是有道理的。

有没有办法在保持格式的同时定义此约束?

sql-server performance
  • 2 个回答
  • 142 Views
Martin Hope
SQLserving
Asked: 2017-01-20 11:10:15 +0800 CST

代理键作为外键

  • 0

我有一个关于代理键的问题,假设我有两个表(在 sql server 中):

表 A:Student_ID、姓名、学校、部门
表 B:Book_ID、Student_ID、IssueDate、BookName

如果 Student_ID 是聚集代理键并且 Name 是非聚集索引。如何在不知道 Student_ID 的情况下手动将数据输入表 B。我知道我可能必须在表 A 中进行查找才能找到 ID,但这效率不高。有什么办法可以提高效率吗?在考虑插入时,我试图考虑代理键在效率方面作为外键的本质工作方式。

sql-server database-design
  • 2 个回答
  • 726 Views
Martin Hope
SQLserving
Asked: 2017-01-13 12:58:11 +0800 CST

外键进程

  • 0

我试图从内部处理的角度了解外键的工作方式(我正在使用 SQLServer)。换句话说,添加外键会如何影响表?

假设我有两个表(PK 是非空表):

表 A:PK Student_ID、 StudentName、StudentAddress
TableB:PK Books_ID、FK Student_ID、Books_IssueMonth

select Student_ID from TableB where Books_IssueMonth=January;

TableB当我在调用中运行 sql 语句时Student_ID,系统是否被告知首先在其中查找它TableA然后指向聚集索引 ( Books_ID) TableB?

会是双表查找吗?

还是在 TableA 中查找并在 TableB 中扫描?

database-design foreign-key
  • 2 个回答
  • 119 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve