Sqlite

在表數據爭吵,sqlite,對組計數的子查詢

  • April 13, 2018

我試圖從中得到,

進口

Ntype   |Color|Code
:-------|:----|:---
example1|Blue |xyz
example1|Red  |xyx
example2|Black|zyz
example3|Grey |zyz

對此,

出口

Name    |Option_Name|Option_Value|Code
:-------|:----------|:-----------|:---
example1|Default    |Default     |
example1|Color      |Blue        |xyz
example1|Color      |Red         |xyx
example2|Default    |Default     |zyz
example3|Default    |Default     |zyz

我一直堅持的部分是,如何對名稱的計數進行子查詢,結果包含比我開始時更多的行?根據名稱是否被多次計算來處理。

首先,它計算每個 Ntype 有多少行。(我添加了 MIN(Code) 只是為了避免在最終結果中再次加入。)

SELECT   Ntype, 
        COUNT(*) AS cnt, 
        MIN(Code) AS Code
FROM     tbl
GROUP BY Ntype;
GO

Ntype    | cnt | Code
:------- | --: | :---
example1 |   2 | xyx 
example2 |   1 | zyz 
example3 |   1 | zyz 

然後,恕我直言,您需要兩個查詢的聯合。“預設”值的第一個。每個不同的 Ntype 一個行,另一個用於 count > 1 的行。

WITH c1 AS 
(
   SELECT   Ntype, 
            COUNT(*) AS cnt, 
            MIN(Code) AS Code
   FROM     tbl
   GROUP BY Ntype
)
SELECT Ntype, 
      'Default' AS Option_Name, 
      'Default' AS Option_Value,
      CASE cnt WHEN 1 THEN Code ELSE '' END AS Code
FROM   c1
UNION ALL
SELECT   tbl.Ntype, 
        'Color' as Option_Name,
        tbl.Color as Option_Value,
        tbl.Code
FROM     c1
JOIN     tbl
ON       c1.Ntype = tbl.Ntype
WHERE    c1.cnt > 1
ORDER BY Ntype, Code;
GO

這是最終輸出:

類型 | 選項名稱 | 選項值 | 程式碼
:------- | :---------- | :----------- | :---
範例1 | 預設 | 預設 | 
範例1 | 顏色 | 紅色 | xyx
範例1 | 顏色 | 藍色 | xyz
範例2 | 預設 | 預設 | 齊茲
範例3 | 預設 | 預設 | 齊茲

*dbfiddle [here](http://dbfiddle.uk/?rdbms=sqlite_3.8&fiddle=4bcdd603d967452d434f849f67d33f1d)*

引用自:https://dba.stackexchange.com/questions/203825