协助SQL查询(聚合)

时间:2014-09-08 01:05:11

标签: sql sql-server sql-server-2012

我需要创建一个Sales报告,并且我有一个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

查询结果如下所示: enter image description here

我想要达到的结果是: Result expected

事务2只有1行SaleLineNo 1或2,而事务1的两行仍然是=因为TCode不同。

由于

我正在使用SSQL2012。

3 个答案:

答案 0 :(得分:0)

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

GROUP BY TlineNo, TCode ...

但是你必须注意不要被导致重复贡献值的东西分组。

答案 1 :(得分:0)

您可以使用允许对组中的行进行分区的ROW_NUMBER函数,并将每个组内的行编号从1开始。如果您选择正确的列来定义分区,并且仅保留“row_number = 1”的行,则您已解决了问题的第一部分,即丢弃了不必出现在报告中的行。(请参阅样本是链接的文档,它们很清楚。)

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

有了观点:

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

SELECT --here your current query -- 
FROM FilteredData

CTE

WITH -- here the rank function query
SELECT -- your current querym, from the CTE

使用subselect

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

答案 2 :(得分:0)

感谢您对我的查询的帮助。玩完之后,我找到了一个可以随心所欲地工作的解决方案。它如下:我在@ 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