Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何基于数据仅显示表中的几列_Sql_Sql Server - Fatal编程技术网

Sql 如何基于数据仅显示表中的几列

Sql 如何基于数据仅显示表中的几列,sql,sql-server,Sql,Sql Server,考虑下表 Name partno. sch_date WO# owed panels aa 1234 08/22/2017 121 22 26 aa 1234 08/22/2017 222 22 27 aa 1234 08/22/2017 242 22 27 aa 1234 08/29/2017 152 20 24 aa 1234 08/29/2017 167 20

考虑下表

Name partno.  sch_date    WO#   owed panels
aa   1234     08/22/2017  121   22    26
aa   1234     08/22/2017  222   22    27
aa   1234     08/22/2017  242   22    27
aa   1234     08/29/2017  152   20    24
aa   1234     08/29/2017  167   20    24
aa   1234     08/29/2017  202   20    26`
是否有可能以这样的方式显示数据:当面板数量大于所欠数量时,我不会显示其他零件号。安排在同一日期

预期结果

Name partno.  sch_date    WO#   owed panels
aa   1234     08/22/2017  121   22    26
aa   1234     08/29/2017  152   20    24
你可以试试这个-

SELECT Name, partno., sch_date, WO#, owed, panels
FROM YOUR_TABLE
WHERE panels < owed
UNION ALL
SELECT Name, partno., sch_date, MIN(WO#), owed, MIN(panels)
FROM YOUR_TABLE
WHERE panels > owed
GROUP BY Name, partno., sch_date, owed
ORDER BY Name

交叉应用在这里可能会有所帮助。注意,您可以看到为什么我在前面的评论中询问顺序,因为表中记录的顺序是不保证的!我们需要知道您希望对记录进行评估的内容!日期是不够的,除非它有一个不显示的时间成分是不同的

Rextester上的工作示例:

作出了许多假设:

当owned is>面板时,您不需要查看记录。 您希望在欠下的是panels的记录。 如果没有日期、名称和零件号的记录,则不希望看到任何记录。 如果这些假设不正确,请提供更好的样本集和预期结果,以测试这些类型的情况,并解释您希望发生的情况

SELECT Distinct B.*
FROM tblName Z
CROSS APPLY (SELECT TOP 1 A.* 
                      FROM tblName A 
                      WHERE A.owed < A.panels
                        and Z.Name = A.Name
                        and Z.[partno.] = a.[partno.]
                        and Z.sch_date = a.sch_date
                      ORDER by A.name, A.[partno.], A.sch_date, A.[wo#]) B
对于运行中的每条记录,一个查询返回名称、零件号和sch_日期的最低wo

更新: 我在一条评论中看到,如果你欠了>面板,你想保留记录。。。如果是先遇到的。。。。但是如果没有先遇到它呢

上次评论更新后:

cte as (
Select A.*, row_number() over (Partition by Name, [partno.],  sch_date ORDER BY [WO#]) RN 
from tblName A 
where owed < panels),

cte2 as (Select * from cte where RN =1
UNION ALL
SELECT Z.*, 0 as rn FROM tblName Z where owed >=panels
 and exists (Select * from cte 
             where Z.name = CTE.name 
               and Z.[partno.] = cte.[partno.] 
               and Z.sch_date = cte.sch_date
               and CTE.[WO#] > Z.[WO#]))

Select * into SOQ#45619304  from  CTE2;  --This line creates the table based on the 2nd cte results.

Select * from SOQ#45619304;

如果同一方发生冲突怎么办?案例最有可能是你正在寻找的功能。我不明白,你说你不想看到面板大于欠下的结果,但你的预期结果都比欠下的面板多?是的,我也不知道你是如何从表格中得到预期结果的。例如,并没有一行是owe=20,panels=27,那个么第二行结果来自哪里呢?你需要更清楚地了解你是如何获得“预期结果”的,因为现在这根本没有任何意义。选择8/22的面板=26而不是面板=27的标准是什么?两者都满足您在问题中所述的规则。如果第一行的配电盘数量不超过欠下的配电盘数量,您想怎么办?如果第一行的配电盘数量少于欠下的配电盘数量,则我想显示该数据并移动到下一行。如果第二行的面板大于欠下的面板,那么我想忽略该sch_日期的零件号的其余部分。非常感谢,你一直是一个巨大的帮助OK,所以即使在更高的WO上欠>=个面板,一旦遇到欠cte as ( Select A.*, row_number() over (Partition by Name, [partno.], sch_date ORDER BY [WO#]) RN from tblName A where owed < panels), cte2 as (Select * from cte where RN =1 UNION ALL SELECT Z.*, 0 as rn FROM tblName Z where owed >=panels and exists (Select * from cte where Z.name = CTE.name and Z.[partno.] = cte.[partno.] and Z.sch_date = cte.sch_date and CTE.[WO#] > Z.[WO#])) Select * into SOQ#45619304 from CTE2; --This line creates the table based on the 2nd cte results. Select * from SOQ#45619304;