SQL查询协助(聚合)

SQL查询协助(聚合),sql,sql-server,sql-server-2012,Sql,Sql Server,Sql Server 2012,我需要创建销售报告,并且有sql查询: SELECT --top 1 t.branch_no as TBranchNo, t.workstation_no as TWorkstation, t.tender_ref_no as TSaleRefNo, t.tender_line_no as TLineNo,

我需要创建销售报告,并且有sql查询:

SELECT  --top 1
                    t.branch_no as TBranchNo,
                    t.workstation_no as TWorkstation,
                    t.tender_ref_no as TSaleRefNo, 
                    t.tender_line_no as TLineNo, 
                    t.tender_code as TCode, 
                    T.contribution as TContribution, 
                    l.sale_line_no as SaleLineNo                    
            FROM TENDER_LINES t
            LEFT JOIN SALES_TX_LINES l 
                    on t.branch_no = l.branch_no and t.workstation_no = l.workstation_no and t.tender_ref_no = l.sale_tx_no
            where l.sale_tx_no = 2000293 OR l.sale_tx_no = 1005246 --OR sale_tx_no = 1005261
            order by t.tender_ref_no asc,
                     l.sale_line_no desc
查询结果如下所示:

我努力实现的结果是:

对于事务2只有一行SaleLineNo 1或2,而对于事务1仍然有=ing两行,因为TCode不同

谢谢


我正在使用SSQL2012。

不太确定您拥有哪些数据,但您可能想试试

GROUP BY TlineNo, TCode ...
但您必须注意不要按会导致重复贡献值的内容分组。

您可以使用该函数将行分组,并从一开始对每个组中的行进行编号。如果您选择了正确的列来定义分区,并且只保留“row_number=1”的行,那么您已经解决了问题的第一部分,即放弃不必出现在报告中的行(请参阅链接文档中的示例,它们非常清楚)

一旦你解决了这个问题,你只需要重复你正在做的事情,但是要根据这个数据的结果,而不是原始数据。你可以使用视图或子选择来实现你的结果,即

鉴于:

CREATE VIEW FilteredData AS -- here the rank function query, then selct from the view

SELECT --here your current query -- 
FROM FilteredData

带子选择

SELECT -- your current query
FROM (SELECT FROM -- here the rank function query -- )

感谢您对我的查询提供的帮助。经过反复研究,我找到了一个完全符合我要求的解决方案。它如下所示:我在几个字段上按照@Yogesh86的提示进行了分组

            SELECT 
                    MAX(t.branch_no) as TBranchNo,
                    Max(t.workstation_no) as TWorkstation,
                    t.tender_ref_no as TSaleRefNo, 
                    Max(t.tender_line_no) as TLineNo, 
                    t.tender_code as TCode, 
                    MAx(T.contribution) as TContribution, 
                    MAX(l.sale_line_no) as SaleLineNo                   
            FROM TENDER_LINES t
            LEFT JOIN SALES_TX_LINES l 
                    on t.branch_no = l.branch_no and t.workstation_no = l.workstation_no and t.tender_ref_no = l.sale_tx_no
                    where l.sale_tx_no = 2000293 OR l.sale_tx_no = 1005246 --OR sale_tx_no = 1005261
            GROUP BY 
                    t.tender_ref_no,
                    t.tender_line_no,
                    t.tender_code   

如果我知道否决投票的原因,我将不胜感激。这让我有机会不再犯那样的错误。根据你的数据,似乎在WHERE子句上添加一个简单的SaleLineNo=1就可以了;-)是的,你必须,但必须是一组,但必须结合have子句meniton或have condition:)我不必使用Having子句。感谢@JotaBe的帮助。我想出了另一种方法来获得结果。
            SELECT 
                    MAX(t.branch_no) as TBranchNo,
                    Max(t.workstation_no) as TWorkstation,
                    t.tender_ref_no as TSaleRefNo, 
                    Max(t.tender_line_no) as TLineNo, 
                    t.tender_code as TCode, 
                    MAx(T.contribution) as TContribution, 
                    MAX(l.sale_line_no) as SaleLineNo                   
            FROM TENDER_LINES t
            LEFT JOIN SALES_TX_LINES l 
                    on t.branch_no = l.branch_no and t.workstation_no = l.workstation_no and t.tender_ref_no = l.sale_tx_no
                    where l.sale_tx_no = 2000293 OR l.sale_tx_no = 1005246 --OR sale_tx_no = 1005261
            GROUP BY 
                    t.tender_ref_no,
                    t.tender_line_no,
                    t.tender_code