如何在3列中的2列中区分查询结果

时间:2014-02-01 03:21:08

标签: sql sql-server distinct

我有这样的查询:

WITH CTE_KELOMPOKINFORMASI (KelompokInformasi, XBRLItem_ItemId) 
AS (
SELECT a.Id AS KelompokInformasi, c.XBRLItem_ItemId
FROM XBRLNamespaces a INNER JOIN XBRLHypercubes b 
ON a.XBRLView_ViewId = b.XBRLView_ViewId 
INNER JOIN XBRLHypercubeDimensionItems c 
ON b.XBRLHypercubeId = c.XBRLHypercube_XBRLHypercubeId 
WHERE a.Id like '%KBIK_AAKL%')

SELECT f.KelompokInformasi, e.Name AS DimensionName, 
ROW_NUMBER() OVER(PARTITION BY e.Name ORDER BY e.Name DESC) AS 'Number'
FROM XBRLDefinitionRoleDomainItems a 
LEFT OUTER JOIN XBRLDefinitionRoleDimensionItems b
ON a.XBRLDefinitionRole_DefinitionRoleId = b.XBRLDefinitionRole_DefinitionRoleId 
LEFT OUTER JOIN XBRLItems c ON a.XBRLItem_ItemId = c.ItemId 
LEFT OUTER JOIN XBRLLabels d ON a.XBRLItem_ItemId = d.XBRLItem_ItemId 
LEFT OUTER JOIN XBRLItems e ON b.XBRLItem_ItemId=e.ItemId
LEFT OUTER JOIN CTE_KELOMPOKINFORMASI f ON b.XBRLItem_ItemId=f.XBRLItem_ItemId
WHERE b.XBRLItem_ItemId=f.XBRLItem_ItemId

它会得到如下结果:

Kelompok Informasi     DimensionName       Number
KBIK_AAKL              JWAAKT              1
KBIK_AAKL              JWAAKT              2
KBIK_AAKL              JWAAKT              3
KBIK_AAKL              SNOUPL              1
KBIK_AAKL              SNOUPL              2
KBIK_AAKL              KOKOLT              1
KBIK_AAKL              KOKOLT              2
KBIK_AAKL              KOKOLT              3
KBIK_AAKL              KOKOLT              4

是否可以通过“DimensionName”再次 DISTINCT 我的结果,所以我得到的结果如下:

KelompokInformasi      DimensionName       Number
KBIK_AAKL              JWAAKT              1
KBIK_AAKL              SNOUPL              2
KBIK_AAKL              KOKOLT              3

我试着像下面的代码那样做,但它不起作用

SELECT DISTINCT DimensionName
FROM (SELECT f.KelompokInformasi, e.Name AS DimensionName, 
ROW_NUMBER() OVER(PARTITION BY e.Name ORDER BY e.Name DESC) AS 'Number'
FROM XBRLDefinitionRoleDomainItems a 
LEFT OUTER JOIN XBRLDefinitionRoleDimensionItems b
ON a.XBRLDefinitionRole_DefinitionRoleId = b.XBRLDefinitionRole_DefinitionRoleId 
LEFT OUTER JOIN XBRLItems c ON a.XBRLItem_ItemId = c.ItemId 
LEFT OUTER JOIN XBRLLabels d ON a.XBRLItem_ItemId = d.XBRLItem_ItemId 
LEFT OUTER JOIN XBRLItems e ON b.XBRLItem_ItemId=e.ItemId
LEFT OUTER JOIN CTE_KELOMPOKINFORMASI f ON b.XBRLItem_ItemId=f.XBRLItem_ItemId
WHERE b.XBRLItem_ItemId=f.XBRLItem_ItemId)

2 个答案:

答案 0 :(得分:2)

在内部子查询上使用您的distinct,在外部选择

上将它们排在行号上
WITH CTE_KELOMPOKINFORMASI (KelompokInformasi, XBRLItem_ItemId) 
AS (
SELECT a.Id AS KelompokInformasi, c.XBRLItem_ItemId
FROM XBRLNamespaces a INNER JOIN XBRLHypercubes b 
ON a.XBRLView_ViewId = b.XBRLView_ViewId 
INNER JOIN XBRLHypercubeDimensionItems c 
ON b.XBRLHypercubeId = c.XBRLHypercube_XBRLHypercubeId 
WHERE a.Id like '%KBIK_AAKL%')

Select A.*, ROW_NUMBER() OVER(ORDER BY A.DimensionName DESC) AS 'Number'
FROM (
    SELECT distinct f.KelompokInformasi, e.Name AS DimensionName
    FROM XBRLDefinitionRoleDomainItems a 
    LEFT OUTER JOIN XBRLDefinitionRoleDimensionItems b
    ON a.XBRLDefinitionRole_DefinitionRoleId = b.XBRLDefinitionRole_DefinitionRoleId 
    LEFT OUTER JOIN XBRLItems c ON a.XBRLItem_ItemId = c.ItemId 
    LEFT OUTER JOIN XBRLLabels d ON a.XBRLItem_ItemId = d.XBRLItem_ItemId 
    LEFT OUTER JOIN XBRLItems e ON b.XBRLItem_ItemId=e.ItemId
    LEFT OUTER JOIN CTE_KELOMPOKINFORMASI f ON b.XBRLItem_ItemId=f.XBRLItem_ItemId
    WHERE b.XBRLItem_ItemId=f.XBRLItem_ItemId
) AS A

答案 1 :(得分:0)

只需使用您的Row_Number过滤

试试这个

SELCT KelompokInformasi,DimensionName,ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS 'NUMBER' FROM
(
SELECT f.KelompokInformasi, e.Name AS DimensionName, 
ROW_NUMBER() OVER(PARTITION BY e.Name ORDER BY e.Name DESC) AS 'RN'    
FROM XBRLDefinitionRoleDomainItems a 
LEFT OUTER JOIN XBRLDefinitionRoleDimensionItems b
ON a.XBRLDefinitionRole_DefinitionRoleId = b.XBRLDefinitionRole_DefinitionRoleId 
LEFT OUTER JOIN XBRLItems c ON a.XBRLItem_ItemId = c.ItemId 
LEFT OUTER JOIN XBRLLabels d ON a.XBRLItem_ItemId = d.XBRLItem_ItemId 
LEFT OUTER JOIN XBRLItems e ON b.XBRLItem_ItemId=e.ItemId
LEFT OUTER JOIN CTE_KELOMPOKINFORMASI f ON b.XBRLItem_ItemId=f.XBRLItem_ItemId
WHERE b.XBRLItem_ItemId=f.XBRLItem_ItemId

) AS T

WHERE RN = 1

<强>(OR)

SELCT KelompokInformasi,DimensionName,ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) AS 'NUMBER' FROM
    (
    SELECT f.KelompokInformasi, e.Name AS DimensionName,          
    FROM XBRLDefinitionRoleDomainItems a 
    LEFT OUTER JOIN XBRLDefinitionRoleDimensionItems b
    ON a.XBRLDefinitionRole_DefinitionRoleId = b.XBRLDefinitionRole_DefinitionRoleId 
    LEFT OUTER JOIN XBRLItems c ON a.XBRLItem_ItemId = c.ItemId 
    LEFT OUTER JOIN XBRLLabels d ON a.XBRLItem_ItemId = d.XBRLItem_ItemId 
    LEFT OUTER JOIN XBRLItems e ON b.XBRLItem_ItemId=e.ItemId
    LEFT OUTER JOIN CTE_KELOMPOKINFORMASI f ON b.XBRLItem_ItemId=f.XBRLItem_ItemId
    WHERE b.XBRLItem_ItemId=f.XBRLItem_ItemId
    GROUP BY f.KelompokInformasi, e.Name        
    ) AS T