SQL:仅根据内容显示值

时间:2016-08-09 16:57:03

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

这是一个复杂的问题,请耐心等待。所以我有下表:

babel-plugin-transform-class-properties

我希望显示位置为加利福尼亚州的每个MasterID,SubID和Location。但是,这就是问题所在。 我不希望显示这些内容,除非在每个MasterID中,每个SubID都有加州位置。

如果MasterID = 100,我不希望显示任何内容,因为在该MasterID中有一个拥有自己的SubID的Texas。

如果MasterID = 99,我希望显示所有3列,因为尽管在该MasterID下有德克萨斯州,但在同一个子ID中也有一个加利福尼亚州。

98不好,因为它的子ID只包含德州。

97是好的,因为它只是加利福尼亚州。

所需的表结果如下:

╔══════════╦═══════╦════════════╗
║ MasterID ║ SubID ║  Location  ║
╠══════════╬═══════╬════════════╣
║      100 ║    50 ║ California ║
║      100 ║    45 ║ Texas      ║
║      100 ║    40 ║ California ║
║       99 ║    29 ║ California ║
║       99 ║    28 ║ Texas      ║
║       99 ║    28 ║ California ║
║       98 ║    15 ║ Texas      ║
║       98 ║    15 ║ Texas      ║
║       97 ║     5 ║ California ║
╚══════════╩═══════╩════════════╝

(删除99 ...... 28 .....德克萨斯也很好)

1 个答案:

答案 0 :(得分:3)

这应该做:

SELECT A.*
FROM dbo.YourTable A
INNER JOIN (SELECT  MasterID,
                    COUNT(DISTINCT SubID) SubIDs,
                    COUNT(DISTINCT CASE WHEN Location = 'California' THEN SubID END) CaliforniaSubIDs
            FROM dbo.YourTable
            GROUP BY MasterID) B
    ON A.MasterID = B.MasterID
WHERE B.SubIDs = B.CaliforniaSubIDs;

Here 您可以看到正在运行的查询。结果是:

╔══════════╦═══════╦════════════╗
║ MasterID ║ SubID ║  Location  ║
╠══════════╬═══════╬════════════╣
║       97 ║     5 ║ California ║
║       99 ║    29 ║ California ║
║       99 ║    28 ║ Texas      ║
║       99 ║    28 ║ California ║
╚══════════╩═══════╩════════════╝

<强>更新

要执行您在评论中说明的内容,您可以使用:

WITH CTE AS
(
    SELECT  A.*,
            RN = ROW_NUMBER() OVER(PARTITION BY MasterID, SubID
                                   ORDER BY CASE WHEN Location LIKE '%Cali%'
                                            OR Location LIKE '%fornia%' THEN 1 ELSE 2 END,
                                            Location)
    FROM dbo.YourTable A
    INNER JOIN (SELECT  MasterID,
                        COUNT(DISTINCT SubID) SubIDs,
                        COUNT(DISTINCT CASE WHEN Location = 'California' THEN SubID END) CaliforniaSubIDs
                FROM dbo.YourTable
                GROUP BY MasterID) B
        ON A.MasterID = B.MasterID
    WHERE B.SubIDs = B.CaliforniaSubIDs;
)
SELECT MasterID, SubID, Location
FROM CTE
WHERE RN = 1;