Sql 使用join语句联接子查询

Sql 使用join语句联接子查询,sql,sql-server,sql-server-2008-r2,subquery,correlated-subquery,Sql,Sql Server,Sql Server 2008 R2,Subquery,Correlated Subquery,试图将子查询应用于表以对其进行分组 主查询 SELECT soitem.fsono, fpartno, soitem.fcfromno, finumber FROM soitem INNER JOIN somast on soitem.fsono = somast.fsono WHERE somast.fsono='034313' ORDER by soitem.fsono, soitem.finumber 子查询 SELECT min(sq.finumber), sq.f

试图将子查询应用于表以对其进行分组

主查询

 SELECT soitem.fsono, fpartno, soitem.fcfromno, finumber
 FROM soitem 
 INNER JOIN somast on soitem.fsono = somast.fsono  
 WHERE somast.fsono='034313'  
 ORDER by soitem.fsono, soitem.finumber
子查询

SELECT min(sq.finumber), sq.fcfromno 
FROM soitem sq 
WHERE sq.fsono='034313' 
GROUP BY sq.fcfromno   

我想使用
min\u finumber
对我的数据集进行进一步分组。这应该显示为三行。我使用我的原始问题作为将子查询合并到整个代码中的方法。我的主要目标是能够成功地将
min\u编号分组

SELECT somast.fsono, 
somast.fcustno, 
somast.fcontact, 
somast.fcustpono, 
somast.fshipvia, 
somast.forderdate, 
somast.fduedate,
 soship.fccompany, 
 soship.fcphone, 
  REPLACE(REPLACE(CONVERT(VARCHAR(MAX), soship.fmstreet), CHAR(13), '|'), CHAR(10), ' ') AS Street,
soship.fccity,
 soship.fcstate, 
 soship.fczip,
 CAST(somast.fackmemo as CHAR(35)) as ShipCode, 
 somast.fordername,
  somast.fcusrchr2,
somast.fcusrchr3,
somast.fcusrchr1, 
somast.festimator, 
soitem.fcfromno, 
 soitem.fcfromtype,
  CASE WHEN soitem.fcfromtype <> 'IFPKIT' THEN soitem.fpartno ELSE soitem.fcfromno END AS Item, 
 CASE WHEN soitem.fcfromtype <> 'IFPKIT' THEN soitem.fquantity ELSE soitem.fquantity / soitem.fquoteqty END AS Qty, 
CASE WHEN soitem.fcfromtype <> 'IFPKIT' 
THEN CAST(soitem.fdesc as CHAR(35))
ELSE 'Store Set (Phantom)' END as Descr

FROM soitem INNER JOIN
 somast ON soitem.fsono = somast.fsono LEFT OUTER JOIN
 soship ON somast.fsono = soship.fcsono AND soship.fcenumber = ''

WHERE   
(somast.fstatus <> 'Cancelled') AND (somast.fsocoord = 'IFP' OR
 somast.fsocoord = '711')
 Group By REPLACE(REPLACE(CONVERT(VARCHAR(MAX), soship.fmstreet), CHAR(13), '|'), CHAR(10), ' '),
 CAST(somast.fackmemo as CHAR(35)),
 somast.fsono,
somast.fcustno,
fcontact,
fcustpono,
fshipvia,
forderdate,
somast.fduedate,

CASE WHEN soitem.fcfromtype<>'IFPKIT' 
THEN soitem.fpartno 
ELSE soitem.fcfromno END,

CASE WHEN soitem.fcfromtype<>'IFPKIT' 
THEN soitem.fquantity 
ELSE soitem.fquantity/soitem.fquoteqty END,

CASE WHEN soitem.fcfromtype <> 'IFPKIT' 
THEN CAST(soitem.fdesc as CHAR(35))
ELSE 'Store Set (Phantom)' END,

soship.fccity, 
soship.fcstate, 
soship.fczip,
fordername, 
fcusrchr2, 
fcusrchr3,
 fcusrchr1, 
festimator,
soitem.fcfromno, 
soitem.fcfromtype,
 soship.fccompany,
  soship.fcphone

ORDER BY somast.forderdate, somast.fsono, soitem.fcfromno
选择somast.fsono,
somast.fcustno,
somast.fcontact,
somast.fcustpono,
somast.fshippia,
索马斯特·福德代特,
somast.fduedate,
soship.fccompany,
soship.fcphone,
替换(将(VARCHAR(MAX)、soship.fmstreet、CHAR(13)、“|”)、CHAR(10)、“)转换为街道,
soship.fccity,
soship.fcstate,
soship.fczip,
将(somast.fackmemo作为CHAR(35))转换为ShipCode,
索马斯特·福德纳姆,
somast.fcusrchr2,
somast.fcusrchr3,
somast.fcusrchr1,
索马斯特·费斯蒂马托,
soitem.fcfromno,
soitem.fcfromtype,
当soitem.fcfrom类型为“IFPKIT”时,则soitem.fpartno ELSE soitem.fcfrom不作为项目结束,
当soitem.fcfrom类型为“IFPKIT”时,则soitem.fquantity ELSE soitem.fquantity/soitem.fquoteqty以数量结束,
soitem.fcfromtype“IFPKIT”时的情况
然后将(soitem.fdesc转换为CHAR(35))
ELSE“存储集(幻象)”结束为描述
从soitem内部连接
somat ON soitem.fsono=somat.fsono左外连接
somast.fsono=soship.fcsono和soship.fcenumber=''上的soship
哪里
(somast.fstatus“已取消”)和(somast.fsocoord='IFP'或
somast.fsocoord='711')
按替换分组(替换(转换(VARCHAR(MAX)、soship.fmstreet)、CHAR(13)、“|”)、CHAR(10)、”,
CAST(somast.fackmemo为CHAR(35)),
索马斯特·福索诺,
somast.fcustno,
fcontact,
福卡斯托诺,
fshipvia,
福特代特,
somast.fduedate,
soitem.fcfromtype'IFPKIT'时的情况
然后是soitem.fpartno
否则soitem.fcfrom没有结束,
soitem.fcfromtype'IFPKIT'时的情况
然后是soitem.fquantity
ELSE soitem.fquantity/soitem.fquantity结束,
soitem.fcfromtype“IFPKIT”时的情况
然后将(soitem.fdesc转换为CHAR(35))
ELSE“存储集(幻影)”结束,
soship.fccity,
soship.fcstate,
soship.fczip,
福德南,
fcusrchr2,
fcusrchr3,
fcusrchr1,
festimator,
soitem.fcfromno,
soitem.fcfromtype,
soship.fccompany,
soship.fcphone
由somast.forderdate、somast.fsono、soitem.fcfromno订购

由于您使用的是SQL Server 2008 R2,因此您可以访问所需的窗口功能。尝试以下方法:

SQL Server 2017架构设置:

CREATE TABLE soitem 
(
     fsono INT, 
     fpartno INT,
     soitem INT, 
     finumber INT, 
     fcfromno INT
);

INSERT INTO soitem (fsono, fpartno, soitem, finumber, fcfromno)
VALUES (1, 1, 1, 1, 1), (1, 2, 2, 5, 1), 
       (2, 2, 2, 9, 2), (2, 2, 2, 2, 2),
       (3, 2, 2, 1, 9);

CREATE TABLE somast (fsono int) ;

INSERT INTO somast (fsono)
VALUES (1), (2);
主要查询:

SELECT 
    soitem.fsono,
    soitem.fpartno,
    soitem.fcfromno,
    soitem.finumber,
    /* THE BELOW PART IS YOUR "JOIN" */
    MIN(soitem.finumber) OVER (PARTITION BY soitem.fsono, soitem.fcfromno) AS min_finumber
FROM 
    soitem 
INNER JOIN 
    somast ON soitem.fsono = somast.fsono  
WHERE 
    somast.fsono = '1'
ORDER BY
    soitem.fsono, soitem.finumber
SELECT soitem.fsono, fpartno, soitem.fcfromno, finumber
FROM soitem 
INNER JOIN somast on soitem.fsono = somast.fsono  
WHERE somast.fsono='1'  
ORDER by soitem.fsono, soitem.finumber
:

您的主要查询:

SELECT 
    soitem.fsono,
    soitem.fpartno,
    soitem.fcfromno,
    soitem.finumber,
    /* THE BELOW PART IS YOUR "JOIN" */
    MIN(soitem.finumber) OVER (PARTITION BY soitem.fsono, soitem.fcfromno) AS min_finumber
FROM 
    soitem 
INNER JOIN 
    somast ON soitem.fsono = somast.fsono  
WHERE 
    somast.fsono = '1'
ORDER BY
    soitem.fsono, soitem.finumber
SELECT soitem.fsono, fpartno, soitem.fcfromno, finumber
FROM soitem 
INNER JOIN somast on soitem.fsono = somast.fsono  
WHERE somast.fsono='1'  
ORDER by soitem.fsono, soitem.finumber

| fsono | fpartno | fcfromno | finumber |
|-------|---------|----------|----------|
|     1 |       1 |        1 |        1 |
|     1 |       2 |        1 |        5 |
SELECT min(sq.finumber), sq.fcfromno 
FROM soitem sq 
WHERE sq.fsono='1' 
GROUP BY sq.fcfromno
|   | fcfromno |
|---|----------|
| 1 |        1 |
您的子查询

| fsono | fpartno | fcfromno | finumber |
|-------|---------|----------|----------|
|     1 |       1 |        1 |        1 |
|     1 |       2 |        1 |        5 |
SELECT min(sq.finumber), sq.fcfromno 
FROM soitem sq 
WHERE sq.fsono='1' 
GROUP BY sq.fcfromno
|   | fcfromno |
|---|----------|
| 1 |        1 |

| fsono | fpartno | fcfromno | finumber |
|-------|---------|----------|----------|
|     1 |       1 |        1 |        1 |
|     1 |       2 |        1 |        5 |
SELECT min(sq.finumber), sq.fcfromno 
FROM soitem sq 
WHERE sq.fsono='1' 
GROUP BY sq.fcfromno
|   | fcfromno |
|---|----------|
| 1 |        1 |

我最终没有使用联接或子查询。通过将
min(finumber)
as min\u fin添加到
SELECT
ORDER by

select soitem.fsono, 
somast.fcustno, 
somast.fcontact, 
somast.fcustpono, 
somast.fshipvia, 
somast.forderdate, 
somast.fduedate,
 soship.fccompany, 
 soship.fcphone, 
REPLACE(REPLACE(CONVERT(VARCHAR(MAX), soship.fmstreet), CHAR(13), '|'), CHAR(10), ' ') AS Street,
soship.fccity,
 soship.fcstate, 
 soship.fczip,
CAST(somast.fackmemo as CHAR(35)) as ShipCode,
CASE WHEN soitem.fcfromtype <> 'IFPKIT' THEN soitem.fpartno ELSE soitem.fcfromno END AS Item, 
CASE WHEN soitem.fcfromtype <> 'IFPKIT' THEN soitem.fquantity ELSE soitem.fquantity / soitem.fquoteqty END AS Qty, 
CASE WHEN soitem.fcfromtype <> 'IFPKIT' 
THEN CAST(soitem.fdesc as CHAR(35))
ELSE 'Store Set (Phantom)' END as Descr,
somast.fordername,
  somast.fcusrchr2,
somast.fcusrchr3,
somast.fcusrchr1, 
somast.festimator, 
soitem.fcfromno, 
soitem.fcfromtype, 

**min(finumber)as min_fin** 

from soitem INNER JOIN
 somast ON soitem.fsono = somast.fsono
 LEFT OUTER JOIN
 soship ON somast.fsono = soship.fcsono AND soship.fcenumber = ''

  where soitem.fsono='034313' 

group by soitem.fsono, CASE WHEN soitem.fcfromtype <> 'IFPKIT' THEN soitem.fpartno ELSE soitem.fcfromno END, 
soitem.fcfromno, soitem.fcfromtype,
somast.fcustno, 
somast.fcontact, 
somast.fcustpono, 
somast.fshipvia, 
somast.forderdate, 
somast.fduedate,
 soship.fccompany, 
 soship.fcphone,
 REPLACE(REPLACE(CONVERT(VARCHAR(MAX), soship.fmstreet), CHAR(13), '|'), CHAR(10), ' '),
soship.fccity,
 soship.fcstate, 
 soship.fczip,
 CAST(somast.fackmemo as CHAR(35)),
 CASE WHEN soitem.fcfromtype <> 'IFPKIT' THEN soitem.fquantity ELSE soitem.fquantity / soitem.fquoteqty END , 
CASE WHEN soitem.fcfromtype <> 'IFPKIT' 
THEN CAST(soitem.fdesc as CHAR(35))
ELSE 'Store Set (Phantom)' END, 
 somast.fordername,
  somast.fcusrchr2,
somast.fcusrchr3,
somast.fcusrchr1, 
somast.festimator

order by soitem.fsono, **min_fin**;
选择soitem.fsono,
somast.fcustno,
somast.fcontact,
somast.fcustpono,
somast.fshippia,
索马斯特·福德代特,
somast.fduedate,
soship.fccompany,
soship.fcphone,
替换(将(VARCHAR(MAX)、soship.fmstreet、CHAR(13)、“|”)、CHAR(10)、“)转换为街道,
soship.fccity,
soship.fcstate,
soship.fczip,
将(somast.fackmemo作为CHAR(35))转换为ShipCode,
当soitem.fcfrom类型为“IFPKIT”时,则soitem.fpartno ELSE soitem.fcfrom不作为项目结束,
当soitem.fcfrom类型为“IFPKIT”时,则soitem.fquantity ELSE soitem.fquantity/soitem.fquoteqty以数量结束,
soitem.fcfromtype“IFPKIT”时的情况
然后将(soitem.fdesc转换为CHAR(35))
ELSE“存储集(幻影)”结束为描述,
索马斯特·福德纳姆,
somast.fcusrchr2,
somast.fcusrchr3,
somast.fcusrchr1,
索马斯特·费斯蒂马托,
soitem.fcfromno,
soitem.fcfromtype,
**最小值(finumber)作为最小值**
从soitem内部连接
somat ON soitem.fsono=somat.fsono
左外连接
somast.fsono=soship.fcsono和soship.fcenumber=''上的soship
其中soitem.fsono='034313'
按soitem.fsono分组,如果soitem.fcfrom类型为“IFPKIT”,则按soitem.fpartno-ELSE soitem.fcfromno-END分组,
soitem.fcfromno,soitem.fcfromtype,
somast.fcustno,
somast.fcontact,
somast.fcustpono,
somast.fshippia,
索马斯特·福德代特,
somast.fduedate,
soship.fccompany,
soship.fcphone,
替换(替换(转换(VARCHAR(MAX)、soship.fmstreet)、CHAR(13)、“|”)、CHAR(10)、”,
soship.fccity,
soship.fcstate,
soship.fczip,
CAST(somast.fackmemo为CHAR(35)),
当soitem.fcfromtype'IFPKIT'然后soitem.fquantity ELSE soitem.fquantity/soitem.fquantity结束时,
soitem.fcfromtype“IFPKIT”时的情况
然后将(soitem.fdesc转换为CHAR(35))
ELSE“存储集(幻影)”结束,
索马斯特·福德纳姆,
somast.fcusrchr2,
somast.fcusrchr3,
somast.fcusrchr1,
索马斯特·费斯蒂马托
soitem.fsono订购,**最小值**;

请解释“将子查询应用于表”的含义。示例数据和所需结果很有帮助。因此,看起来您正在尝试在
soitem
表中查找当前行的
finumber
和最小
finumber
,对吗?是的,这是正确的。我一直在尝试使用fsono+finumber加入它们。即使没有与
somast
表匹配的
finumber
fcfrom
或刚刚匹配的记录的最小值,您是否想要
fpartno
finumber
中的
最小值表还是
somast
表?这会得到我需要的结果,但我无法按
min\u finumber
分组
min\u finumber
在运行
groupby
时不存在。本质上,SQL查询的逻辑过程如下:
FROM>WHERE>groupby>HAVING>SELECT>DISTINCT>orderby>TOP
。如果需要按
min\u finumber
分组,请将查询包含在另一个子查询中。您打算如何处理新的
分组依据
?也许有更好的方法可以得到你最终想要的东西。我希望能够找到
min\u finumber',这样我就可以对它进行分组,因为它们是重复的数据