Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.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,我有这段代码,它返回的是一些客户端的列表,但它列出的太多了。这是因为它列出了几个相同的东西,只是日期不同。我只想显示最新的日期,不想显示其他日期。我试着用Client_代码进行分组,但没有成功,它只是通过一个聚合函数或类似的东西(如果需要可以得到)。我被要求得到的是我们所有的客户,列出了所有的细节。在“as”部分,它们都能正常通过。如果我取出: I.DATE_LAST_POSTED as 'Last Posted', I.DATE_LAST_BILLED as 'Last Billed' 它显

我有这段代码,它返回的是一些客户端的列表,但它列出的太多了。这是因为它列出了几个相同的东西,只是日期不同。我只想显示最新的日期,不想显示其他日期。我试着用Client_代码进行分组,但没有成功,它只是通过一个聚合函数或类似的东西(如果需要可以得到)。我被要求得到的是我们所有的客户,列出了所有的细节。在“as”部分,它们都能正常通过。如果我取出:

I.DATE_LAST_POSTED as 'Last Posted',
I.DATE_LAST_BILLED as 'Last Billed'
它显示的很好,但我只需要最后一个账单日期出现。但把这些行放进去,会让客户多次列出所有不同的账单日期。我认为这是因为它在物质主表中跨越了不同的物质。基本上,我只想显示客户信息的最高事项有最后一个计费日期

请让我知道,如果这需要澄清,我试图解释最好的我可以

SELECT DISTINCT
A.DIWOR as 'ID',
B.Client_alpha_Name as 'Client Name',
A.ClientCODE as 'Client Code',
B.Client_address as 'Client Address',
D.COMM_NO AS 'Contact',
E.Contact_full_name as 'Possible Key Contact',
G.LOBSICDESC as 'LOBSIC Code',
H.EARNERNAME as 'Client Care Parnter',
A.CLIENTCODE + '/' + LTRIM(STR(A.LAST_MATTER_NUM)) as 'Last Matter Code',
I.DATE_LAST_POSTED as 'Last Posted',
I.DATE_LAST_BILLED as 'Last Billed'
FROM CLIENT_MASTER A
JOIN CLIENT_INFO B 
ON A.CLIENTCODE=B.CLIENT_CODE
JOIN MATTER_MASTER C
ON A.DIWOR=C.CLIENTDIWOR 
JOIN COMMINFO D
ON A.DIWOR=D.DIWOR
JOIN CONTACT E
ON A.CLIENTCODE=E.CLIENTCODE
JOIN VW_CONTACT F
ON E.NAME_DIWOR=F.NAME_DIWOR    
JOIN LOBSIC_CODES G
ON A.LOBSICDIWOR=G.DIWOR
JOIN STAFF H
ON A.CLIENTCAREPARTNER=H.DIWOR
JOIN MATTER I
ON C.DIWOR=I.MATTER_DIWOR
WHERE F.COMPANY_FLAG='Y'
AND C.MATTER_MANAGER NOT IN ('78','466','2','104','408','73','51','561','504','101','13','534','16','461','531','144','57','365','83','107','502','514','451')  
AND I.DATE_LAST_BILLED > 0
GROUP BY A.ClientCODE
ORDER BY A.DIWOR

您的问题是没有使用足够的聚合函数。这可能就是您同时使用
DISTINCT
子句和
groupby
子句的原因(建议使用
groupby
,而不是
DISTINCT

所以。。。删除
DISTINCT
,将必要的(唯一的,或多或少的)列列表添加到
GROUP BY
子句中,并将其余列包装在聚合函数、常量或子选择中。在需要最大日期的特定情况下,将其包装在
MAX()
函数中。

如果我理解正确:

--=======================
-- sample data - simplifed output of your query
--=======================
declare @t table
(
    ClientCode int,
    ClientAddress varchar(50),
    DateLastBilled datetime
    -- the rest of fields is skipped
)

insert into @t values (1, 'address1', '2011-01-01')
insert into @t values (1, 'address1', '2011-01-02')
insert into @t values (1, 'address1', '2011-01-03')
insert into @t values (1, 'address1', '2011-01-04')

insert into @t values (2, 'address2', '2011-01-07')
insert into @t values (2, 'address2', '2011-01-08')
insert into @t values (2, 'address2', '2011-01-09')
insert into @t values (2, 'address2', '2011-01-10')


--=======================
-- solution
--=======================
select distinct
    ClientCode,
    ClientAddress,
    DateLastBilled
from
(
    select 
        ClientCode,
        ClientAddress,
        DateLastBilled,
        -- list of remaining fields
        MaxDateLastBilled = max(DateLastBilled) over(partition by ClientCode)
    from 
    (
        -- here should be your query
        select * from @t
    ) t
) t
where MaxDateLastBilled = DateLastBilled

非常感谢!这真的很有帮助,我不知道你不能使用Distinct和Group By;这样做可能会导致奇怪的行为。通常,它们用于实现相同(大致)的效果-指定
DISTINCT
与指定
groupby
相同,然后列出每一列。当您得到重复的结果时,
DISTINCT
会删除它们。但是,通常最好重构查询以删除重复项,使用
groupby
进行汇总,并根据需要进行子选择;这有助于明确说明所需的结果。